самый быстрый алгоритм поиска - PullRequest
1 голос
/ 13 июля 2010

Я пытаюсь реализовать алгоритм для поиска нескольких файлов XML для определенной записи.известно, что записи не отсортированы (у меня нет индексированного идентификатора).Какой самый быстрый алгоритм для поиска этой записи?
пожалуйста, дайте мне знать, если что-то было неясно
заранее спасибо

Ответы [ 5 ]

6 голосов
/ 13 июля 2010

Все, что вам нужно решить, находится здесь Алгоритмы сортировки

4 голосов
/ 13 июля 2010

Без сортировки линейный поиск - ваш лучший выбор. Подумай об этом.

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

3 голосов
/ 13 июля 2010

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

2 голосов
/ 13 июля 2010

galambalazs правильно: несортированные данные означают, что вам нужно пройти через все это, чтобы найти то, что вам нужно. Но это только небольшая часть вопроса.

При обработке нескольких файлов, вероятно, большая часть вашего времени будет занята файловым вводом / выводом. По компьютерным стандартам требуется много времени, чтобы найти файл в каталоге и открыть его. Но это затраты, которые вы будете нести в основном независимо от того, какую программу вы используете.

Другая часть уравнения производительности - это тип используемого вами анализатора. В зависимости от структуры вашего XML, у вас есть выбор использования рукописного синтаксического анализатора, синтаксического анализатора XML DOM или синтаксического анализатора Sax.

Если теги, окружающие искомые данные, всегда располагаются в одной строке с этими данными, и двусмысленность невозможна, тогда допустимое чтение файла построчно и поиск либо по строке, либо по регулярному выражению. Многие люди на SO будут протестовать, что сопоставление регулярных выражений - это ужасный способ обработки XML, и это в целом правильно; это быстрый и грязный способ выполнять поиск в очень специфическом и ограниченном наборе случаев, и он очень хрупок по отношению к структуре XML, с которой вы в конечном итоге работаете.

Анализатор DOM "вдыхает" весь ваш XML-документ в структуру в памяти, которую ваше приложение затем может последовательно искать, что бы это ни было. DOM хороши, когда вы хотите выполнить ряд сложных операций над деревом XML; для последовательного поиска это ужасная идея, потому что

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

Следовательно, наиболее рекомендуемый подход - использовать SAX-парсер. Поиск в Google найдет для вас любимый язык. Парсер SAX просматривает ваш входной файл один раз, генерируя события для каждого элемента, который вы можете (и должны!) Обрабатывать соответствующим образом. Данные обрабатываются последовательно, и нет ничего, кроме того, что вы решили сделать с найденными данными. SAX-парсеры, как правило, значительно быстрее, чем DOM-парсеры, но требуют небольшого планирования обработки событий.

0 голосов
/ 13 июля 2010

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

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