С помощью простого BST, где порядок вставки элементов случайным образом, у вас есть способ, чтобы определить, сколько элементов точно меньше заданного элемента без прохождения по дереву.
Если у вас есть сбалансированное дерево, например, красно-черного дерева, то вы могли бы по крайней мере поставить нижнюю и верхнюю границу индекса из-за границы на высоте дерева. Если порядок вставки элементов к BST не является случайным, то опять же, вы могли бы сказать что-то о высоте дерева, не идя его и дать некоторую оценку приближенного индекса.
Что касается вспомогательных структур данных, можно создать вспомогательный словарь, который отображает элементы в их индекс. Однако создание этого индекса занимает O (N), а индекс становится несвежим при добавлении новых элементов в BST, так что это хорошо работает только для BSTs с редкими обновлениями.
Другое решение заключается в расширении BST узлов с двумя свойствами: индекс и считать. Индекс говорит, сколько элементов меньше, чем в этом узле в дереве. Граф говорит, сколько элементов было в BST, когда вы в последний раз обновленный индекс этого узла. При относительно простых изменений вставки, удаления и поиска на BST, что не влияет на эти основные операции за пределами постоянного времени, и может получить индекс элемента непосредственно в O (1).
По существу, как вы вставляете новый узел для каждого узла, который проходит на своем пути вниз, если новый элемент меньше (т.е. ваш следующий шаг к левому ребенку), увеличивают как индекс и количество этого узла. Когда вы находите место нового элемента, вы даете ему счетчик на основе его родителей, и индекс, основанный на его родителей и левого ребенка. Это оставляет элементы больше, чем новый с неправильным индексом, но вы можете легко обновлять, что при поиске элемента, обращаясь к значению счетчика родителя - разница между кол-родителем и ребенком расскажет вам, как много вставок меньших элементов произошли после последнего обновления индекса ребенка, так что вы просто добавить, что разницу в индекс.