Если у меня есть очень большой отсортированный список, хранящийся во внешнем хранилище. Предполагая, что этот список нельзя перенести во внутреннюю память, каким будет хороший алгоритм поиска, который ищет ключ в этом списке в псевдокоде? какова будет временная сложность?, а также какие основные факторы следует учитывать при разработке этого алгоритма?
Алгоритм внешнего поиска
Ответы (1)
Предположим, что ваше внешнее хранилище — это просто массив записей постоянного размера, хранящихся в файле, и ваш язык программирования позволяет карту памяти файла, вы можете использовать обычный алгоритм бинарного поиска.
Скажем, в C++ вы
- mmap файл принимает указатели void* на начало и конец файла mmap,
- укажите указатели на ваш тип записи
- а затем выполните поиск записи с помощью std::lower_bound(), который является одним из стандартные реализации бинарного поиска.
Обратите внимание, что сопоставление памяти с файлом не означает загрузку всего файла во внутреннюю память, вместо этого система автоматически загрузит необходимые страницы из файла в кэш загруженных страниц с умными политиками сохранения размера кэшированных страниц в пределах доступной памяти.
Это стандартная практика поиска в отсортированных файлах, и нет смысла ее переделывать (ну, насколько мне известно). Сложность алгоритма бинарного поиска во внешней памяти зависит от модели внешнего хранилища, стратегии буферизации/подкачки и т. д., но для вашего жесткого диска вы все равно можете предположить, что он находится в обычном O (log N). Я рекомендую вам поискать руководства по нестандартным алгоритмам и структурам данных. и библиотеки.