Сверхбыстрый запрос «начинается с» с диска - PullRequest
2 голосов
/ 11 декабря 2010

У меня есть 40 МБ (слишком большой для памяти в данном случае) список строк, которые я хочу сделать «начинается с» запросов для извлечения совпадений. Кто-нибудь знает хорошую структуру данных для этого? Бонусные баллы за существующую реализацию на Java. Я был бы готов пожертвовать «начинается с» только для точного соответствия, если что-то уже существует. Диск на основе диска звучит идеально.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Похоже, вам нужно что-то вроде этого: http://en.wikipedia.org/wiki/Trie

Реализация в Java может быть найдена здесь , хотя она не основана на диске.Я продолжу поиск: /

Полезные статьи: Три-методы для текстовых и пространственных данных на вторичном хранилище , B-попытки для управления строками на диске

Редактировать: я сталкивался с этим, может быть полезно: MG4J: Управление гигабайтами для Java ™

1 голос
/ 11 декабря 2010

Не могу предложить ни одной существующей библиотеки, но я уже сталкивался с подобной проблемой.Это довольно просто, если вы не планируете динамически изменять свой список и можете сортировать строки в файле (для двоичного поиска).

Давайте разберем ваши 40 МБ на 1000 кусков примерно одинакового размера и сохраним первую строкуиз каждого куска в памяти.Это был бы массив из 1000 строк.Они упорядочены, потому что упорядочен оригинальный список.
Когда вам нужно выполнить запрос, вы можете использовать бинарный поиск по этому массиву.Это покажет вам, в какой строке результата находится фрагмент.Затем вы можете прочитать этот фрагмент с диска (около 40 КБ) и выполнить поиск по его содержимому.

Например, если массив содержит значения ["andrew", "brian", "donald", "john"] и вы ищете префикс "cris", вы знаете, что все кристофоры и кристианево втором куске.

...