![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Добрый день!
Есть словарь из 200 тыс. слов. Мне нужно перебирать строки в файле и смотреть, есть ли слова из этой строки в моем словаре. Сейчас у меня словарь тупо отсортирован по алфавиту а загнан в хеш: $hash{word}=1. Ищу с помощью if (exists $hash{$word}) Подскажите, как лучше организовать такой словарь, чтобы ускорить в нем поиск? |
|||
|
||||
| Pretorian |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 9.12.2011 Где: нигде Репутация: нет Всего: 1 |
если отсортирован, можно организовать бинарный поиск. будет искать быстро
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Как вы умудрились отсортировать хеш?
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Suppir, а какая скорость поиска сейчас и какую необходимо получить?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Cкорость доступа к хэшу вообще O(1). Вы уверены, что проблема именно в этом, а не в чём-то другом?
|
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Насчет хеша я наврал, конечно.
Первоначальная версия программы была написана на Perl и я использовал хеш. А потом я перенес код на c# и использовал список (List) - аналог массива Perl. Так вот, сначала я использовал просто отсортированный по алфавиту словарь. А теперь сделал частотный - слова, которые встречаются часто, расположены в начале словаря, а те, которые встречаются редко - в конце. Программа стала в 5 раз быстрее!!! |
|||
|
||||
| od0201 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 16.1.2009 Репутация: 1 Всего: 1 |
с хешем конечно быстрее, но.....как у меня есть вариант, который вам еще не предлагали (не судите строго)
возложите свои проблемы на БД, при этом проверяйте так, select slovo FROM slovar WHERE slovo='mama' or slovo='myla' or slovo='ramy' то есть не по одному слову, а предложениями, а затем уже результат сравнивайте "ручкими"... |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
По базам данных поиск намного медленней, чем по словарю в оперативной памяти, имхо.
|
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
зафигачить весь словарь (каждое слово) в crc32 , получим 800 кб что фигня, и сверять не слово из букавок непонятной длинны а crc32 слова, с точки зрения любого процессора самый быстрый вариант.
-------------------- |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
"зафигачить весь словарь (каждое слово) в crc32"
можно поподробнее? Добавлено через 1 минуту и 51 секунду Дело в том, что мне потом не одно слово нужно будет искать в словаре, а много миллионов слов проверять через этот словарь. Если для каждого слова еще вычислять контрольную сумму, то, боюсь, это будет медленней работать, чем просто поиск по словарю. |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Ну к примеру в словаре слово "макулатура" занимает 10 байт + 1 как идентификатор конец строки (в лучшем случае) и того 11 байт которые нада сверить.
Вместо слова храним его crc - контрольную сумму которая займет всего 4 байта. Соответственно при проверке текста , берем слово из текста, получаем его crc32 и сверяем с нашей базой-словарем. Если есть то есть, а если нет то нет ) -------------------- |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Если одно слово нужно сверить, то понятно. Но если нужно несколько миллионов слов сверять со словарем, то нужно каждое слово конвертировать в этот crc.
|
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Нифига, словарь ты готовиш заранее, а вычесление контрольной суммы строки/слова не процессороемкая задача.
А вот сравнение двух строк очень даже. Грубо говоря не вникая в архитиктуру, сравнение двух 4 байтовых значений процессор сделает всего 1 операцией, а сравнение строки из 10 байт за 10. Это сообщение отредактировал(а) 500mhz - 6.4.2012, 14:57 -------------------- |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |