Как найти индекс элемента в отсортированном наборе?

голоса
4

Я могу найти элемент в отсортированном наборе (поддержанный BST) в O(logN). Теперь я хотел бы , чтобы индекс этого элемента. Так , например, в наборе {1, 3, 4, 10}, индекс 4IS 2и индекс 1находится 0.

Очевидно, что я могу просто перебрать множество, так что тривиальное решение O(N). Мы можем сделать лучше , используя , вероятно , BST свойств и / или вспомогательные структуры данных?

Задан 09/05/2011 в 11:46
источник пользователем
На других языках...                            


1 ответов

голоса
3

С помощью простого BST, где порядок вставки элементов случайным образом, у вас есть способ, чтобы определить, сколько элементов точно меньше заданного элемента без прохождения по дереву.

Если у вас есть сбалансированное дерево, например, красно-черного дерева, то вы могли бы по крайней мере поставить нижнюю и верхнюю границу индекса из-за границы на высоте дерева. Если порядок вставки элементов к BST не является случайным, то опять же, вы могли бы сказать что-то о высоте дерева, не идя его и дать некоторую оценку приближенного индекса.

Что касается вспомогательных структур данных, можно создать вспомогательный словарь, который отображает элементы в их индекс. Однако создание этого индекса занимает O (N), а индекс становится несвежим при добавлении новых элементов в BST, так что это хорошо работает только для BSTs с редкими обновлениями.

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

По существу, как вы вставляете новый узел для каждого узла, который проходит на своем пути вниз, если новый элемент меньше (т.е. ваш следующий шаг к левому ребенку), увеличивают как индекс и количество этого узла. Когда вы находите место нового элемента, вы даете ему счетчик на основе его родителей, и индекс, основанный на его родителей и левого ребенка. Это оставляет элементы больше, чем новый с неправильным индексом, но вы можете легко обновлять, что при поиске элемента, обращаясь к значению счетчика родителя - разница между кол-родителем и ребенком расскажет вам, как много вставок меньших элементов произошли после последнего обновления индекса ребенка, так что вы просто добавить, что разницу в индекс.

Ответил 09/05/2011 в 13:13
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more