Легче всего реализовать онлайн отсортированную структуру данных в C - PullRequest
1 голос
/ 11 апреля 2011

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

Currentlty Я помещаю их в массив, затем сортирую индекс по ним, используя qsort(), который работает нормально.

Но из любопытства я подумываю вместо этого вставить каждую строку в структуру данных, которая поддерживает их в алфавитном порядке, когда я сканирую их из источника данных, частично для опыта его добавления, частично потому, что он будет работать быстрее без ожидание завершения сортировки после завершения сканирования (-:

Какую структуру данных было бы наиболее просто реализовать в C?

UPDATE

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

РЕЗЮМЕ

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

Ответы [ 4 ]

3 голосов
/ 11 апреля 2011

Двоичные деревья поиска.Или самобалансирующиеся поисковые деревья.Но не ожидайте, что они будут быстрее, чем правильно реализованный динамический массив, так как массивы имеют намного лучшую локальность ссылок, чем структуры указателей.Кроме того, несбалансированные BST могут «идти линейно», поэтому весь ваш алгоритм становится O ( n ²), как быстрая сортировка.

2 голосов
/ 19 апреля 2011

Вы уже используете оптимальный подход. Сортировка в конце будет намного дешевле, чем поддержка онлайн-сортированной структуры данных. Вы можете получить тот же O (logN) с rb-деревом, но константа будет намного хуже, не говоря уже о значительных затратах пространства.

Тем не менее, AVL-деревья и rb-деревья гораздо проще реализовать, если вам не нужно поддерживать удаление. Лево-ориентированное дерево может вмещать около 50 строк кода. См http://www.cs.princeton.edu/~rs/talks/LLRB/ (автор Седжвик)

0 голосов
/ 18 апреля 2011

Вы должны взглянуть на структуру данных Trie wikilink я думаю, что это послужит тому, что вы хотите

0 голосов
/ 11 апреля 2011

Вы можете реализовать более быстрый алгоритм сортировки, такой как Timsort или другие алгоритмы сортировки с наихудшим случаем nlog (n), и просто искать его с помощью бинарного поиска, поскольку он быстрее, если список сортируется.

...