Какой лучший способ поиска в миллионах имен файлов с поддержкой подстановочных знаков (GLOB) - PullRequest
7 голосов
/ 07 февраля 2010

Я работаю над небольшой поисковой системой, чтобы отобразить совпадающие имена файлов с полным путем. и важно то, что мне нужно обеспечить поиск по шаблону (GLOB), например *.doc или *list*.xlx или *timesheet* или ???.doc или что-то в этом роде.

я нашел какое-то связанное решение

Поиск строк, соответствующих шаблону "abc: *: xyz", менее чем за O (n)

но я ищу эффективные алгоритмы, которые могут найти совпадения из миллиона имен файлов менее чем за секунду, поэтому требуется лучше, чем O (n) ..

Я думаю о двухфазном алгоритме с поиском массива подстрок (массив суффиксов + массив префиксов) в первой фазе и обычным поиском RegEx по результатам первой фазы второй фазы.

любая помощь будет принята с благодарностью ...

Ответы [ 2 ]

3 голосов
/ 08 февраля 2010
2 голосов
/ 07 февраля 2010

Насколько я знаю, нет способа сделать лучше, чем O (n) для обобщенного поиска глобуса.

Однако для особых случаев поиска префиксов и суффиксов вы можете самостоятельно отсортировать индексы для выполнения двоичного поиска, что приведет к O (log n) для поиска префиксов и суффиксов. Индекс префикса будет отсортирован на основе первого символа, затем второго и так далее. Индекс суффикса будет отсортирован по последнему символу, затем второму последнему и т. Д. (Обратные строки).

Я бы поступил так, как вы предлагаете в своем посте, и выполнил поиск в два этапа: поиск по индексам префикса или суффикса, а затем поиск методом грубой силы по сокращенному списку, предоставленному на первом этапе, с использованием регулярного выражения, созданного из глоба.

Поскольку сравнения длины строк выполняются быстрее, чем регулярные выражения, я бы также предварительно отфильтровал минимальную совпадающую длину строки или строку сопоставления фиксированной длины для примера ???. Doc.

Исходя из звучания вашего исходного поста, индексы должны будут ссылаться и на полный путь каждой записи, чтобы вы могли отобразить его после того, как будут найдены окончательные результаты.

...