Какая структура данных поиска лучше всего работает для отсортированных целочисленных данных? - PullRequest
3 голосов
/ 03 сентября 2011

У меня отсортировано целых чисел более миллиарда, какая структура данных, по вашему мнению, может использовать отсортированное поведение?Основная цель - быстрее искать элементы ...
Опции, которые я могу придумать -
1) обычные деревья бинарного поиска с рекурсивным разбиением в среднем подходе.
2) Должны работать любые другие сбалансированные деревья бинарного поискахорошо, но не использует отсортированную эвристику ..

Заранее спасибо ..

[Редактировать]
Вставки и удаления очень редки ...
Кроме того, кромецелые числа Мне нужно хранить некоторую другую информацию в узлах, я думаю, что обычные массивы не могут этого сделать, если это не список, верно?

Ответы [ 4 ]

7 голосов
/ 03 сентября 2011

Это действительно зависит от того, какие операции вы хотите выполнить с данными.

Если вы просто ищете данные и никогда ничего не вставляете или не удаляете, просто хранение данных в гигантском отсортированном массиве может быть вполне подходящим,Затем вы можете использовать бинарный поиск для эффективного поиска элементов за O (log n) времени.Однако вставки и удаления могут быть дорогими, поскольку с миллиардом целых чисел O (n) повредит.Вы можете хранить вспомогательную информацию внутри самого массива, если хотите, просто поместив ее рядом с каждым из целых чисел.

Однако при наличии миллиарда целых чисел это может быть слишком интенсивно, и вы можетехочу переключиться на использование битового вектора.Затем вы можете выполнить двоичный поиск по битовому вектору за время O (log U), где U - количество битов.С миллиардом целых чисел я предполагаю, что U и n будут близки, так что это не так уж много штрафа.В зависимости от размера машинного слова, это может сэкономить от 32x до 128x памяти без значительного снижения производительности.Кроме того, это увеличит локальность бинарных поисков и может также повысить производительность.это действительно делает намного более медленным выполнение итерации по числам в списке, но это делает вставки и удаления занимающими O (1) время.Для этого вам необходимо сохранить некоторую вторичную структуру (возможно, хеш-таблицу?), Содержащую данные, связанные с каждым из целых чисел.Это не так уж плохо, поскольку вы можете использовать этот отсортированный битовый вектор для отсортированных запросов и несортированной хэш-таблицы, как только вы найдете то, что ищете.

Если вам также нужно добавлять и удалять значенияиз списка, сбалансированный BST может быть хорошим вариантом.Однако, поскольку вы точно знаете, что храните целые числа, вы можете захотеть взглянуть на более сложную древовидную структуру Ван Эмде Боаса, которая поддерживает вставку, удаление, предшественник, преемник, find-max и find-min все в O (log log n) время, которое экспоненциально быстрее, чем двоичные деревья поиска.Затраты на реализацию этого подхода высоки, так как структура данных, как известно, сложно сделать правильно.

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

Надеюсь, это поможет!

2 голосов
/ 03 сентября 2011

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

http://en.wikipedia.org/wiki/Interpolation_search

Не позволяйте худшему случаю, ограниченному O (n), пугать вас, потому что с 1 миллиардом целых чисел получить практически невозможно.

2 голосов
/ 03 сентября 2011

Лучшей структурой данных для поиска отсортированных целых чисел является массив.

Вы можете искать его с помощью операций log (N), и он более компактен (меньше затрат памяти), чем дерево.

И вам даже не нужно писать какой-либо код (так меньше шансов на ошибку) - просто используйте bsearch из вашей стандартной библиотеки.

1 голос
/ 03 сентября 2011

O (1) решения:

  • Предполагается, что 32-разрядные целые и много оперативной памяти:

Таблица поиска размером примерно 2³² (4 миллиарда элементов), где каждый индекс соответствует количеству целых чисел с этим значением.

  • Предполагая, что большие целые числа:

Действительно большой хэш-стол. Обычная хеш-функция модуля была бы уместна, если у вас есть приличное распределение значений, если нет, вы можете объединить 32-битную стратегию с поиском хеша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...