Ищете специальную структуру данных C ++ - PullRequest
8 голосов
/ 10 августа 2011

Я ищу реализацию C ++ структуры данных (или комбинации структур данных), которая удовлетворяет следующим критериям:

  • элементы доступны так же, как вstd :: vector
  • обеспечивает итератор произвольного доступа (вместе с итераторным сравнением <,>)
  • средний элемент доступ (: поиск). Время худшее изO(log(n)) сложность
  • элементы перебираются в том же порядке, в котором они были добавлены в контейнер
  • с учетом итератора, я могу узнать порядковый номер элемента, на который указывает контейнерв худшем случае O(log(n)) сложность
  • обеспечивает вставку и удаление элемента в определенной позиции в худшем случае O(log(n)) сложность
  • удаление / вставка элементов ранее не отменяетполученные итераторы

Заранее благодарю за любые предложения

Далибор

(Правка) Ответы:

Выбранный мной ответ описывает структуру данныхчто явсе эти требования.Тем не менее, boost :: multi_index, как предложил Максим Егорушкин, предоставляет функции, очень близкие к описанным выше.

(Правка) Некоторые из требований были указаны неправильно.Они модифицируются в соответствии с коррекцией (: оригинал)

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

(Правка) Рассмотрите возможность использования массива AVL, предложенного sp2danny

Ответы [ 5 ]

4 голосов
/ 10 августа 2011

Исходя из ваших требований boost::multi_index с двумя индексами добивается цели.

Первый индекс упорядоченный индекс Это позволяет для O (log (n)) вставить / искать / удалить.Второй индекс индекс произвольного доступа .Это позволяет осуществлять произвольный доступ, а элементы хранятся в порядке вставки.Для обоих индексов итераторы не становятся недействительными при удалении других элементов.Преобразование из одного итератора в другой - операция O (1).

3 голосов
/ 10 августа 2011

Давайте пройдемся по этим ...

  • среднее время поиска элементов в худшем случае из сложности O (log (n))
  • удаление / вставка элементов делаетне делает недействительными ранее полученные итераторы
  • обеспечивает вставку и удаление элементов в худшем случае O (log (n)) сложности

Это в значительной степени кричит "дерево".

  • предоставляет итератор с произвольным доступом (вместе с итераторным сравнением <,>)
  • с учетом итератора, в худшем случае я могу узнать порядковую позицию элемента, на который указывает контейнер,сложности O (log (n))
  • элементы повторяются в том же порядке, в котором они были добавлены в контейнер

Я предполагаю, что индекс выВы предоставляете свой итератор с произвольным доступом в порядке вставки, поэтому [0] будет самым старым элементом в контейнере, [1] будет следующим самым старым и т. д. Это означает, что при удалении итераторы должны бытьдопустимо, итератор внутренне не может хранить индбывший, так как он может измениться без предварительного уведомления.Так что просто использование map с ключом, являющимся порядком вставки, не сработает.

Учитывая, что каждый узел вашего дерева должен отслеживать, сколько элементов в каждом поддереве, кроме того,своим обычным членам.Это позволит произвольный доступ со временем O(log(N)).Я не знаю о готовом наборе кода, но подклассы std::rb_tree и std::rb_node были бы моей отправной точкой.

0 голосов
/ 22 ноября 2014

Вот мой контейнер "lv", который соответствует требованию, O (log n) время вставки / удаления / доступа.https://github.com/xhawk18/lv

Контейнер является библиотеками только для заголовков C ++ и имеет тот же итератор и функции с другими контейнерами C ++, такими как list и vector.

Контейнер "lv" основан на rb-дерево, каждый узел которого имеет значение размера, равное количеству узлов в поддереве.Проверяя размер левого / правого дочернего элемента дерева, мы можем быстро получить доступ к узлу случайным образом.

0 голосов
/ 24 июня 2014

AVL-Array должен отвечать всем требованиям.

0 голосов
/ 10 августа 2011

См. Здесь: Контейнеры STL (прокрутите страницу вниз, чтобы увидеть информацию о сложности алгоритмов), и я думаю, std::deque соответствует вашим требованиям.

...