Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как ускорить поиск по словарю? 
:(
    Опции темы
Suppir
Дата 4.4.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Добрый день!

Есть словарь из 200 тыс. слов. 

Мне нужно перебирать строки в файле и смотреть, есть ли слова из этой строки в моем словаре. 

Сейчас у меня словарь тупо отсортирован по алфавиту а загнан в хеш: $hash{word}=1.
Ищу с помощью if (exists $hash{$word})

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


PM MAIL   Вверх
Pretorian
Дата 4.4.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 9.12.2011
Где: нигде

Репутация: нет
Всего: 1



если отсортирован, можно организовать бинарный поиск. будет искать быстро
PM   Вверх
Pfailed
Дата 4.4.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Как вы умудрились отсортировать хеш?


--------------------
PM MAIL   Вверх
ginnie
Дата 4.4.2012, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Suppir, а какая скорость поиска сейчас и какую необходимо получить?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
DurRandir
Дата 4.4.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Cкорость доступа к хэшу вообще O(1). Вы уверены, что проблема именно в этом, а не в чём-то другом?
PM   Вверх
Suppir
Дата 5.4.2012, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Насчет хеша я наврал, конечно.
Первоначальная версия программы была написана на Perl и я использовал хеш.
А потом я перенес код на c# и использовал список (List) - аналог массива Perl.

Так вот, сначала я использовал просто отсортированный по алфавиту словарь. А теперь сделал частотный - слова, которые встречаются часто, расположены в начале словаря, а те, которые встречаются редко - в конце. Программа стала в 5 раз быстрее!!!

PM MAIL   Вверх
od0201
Дата 5.4.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 16.1.2009

Репутация: 1
Всего: 1



с хешем конечно быстрее, но.....как у меня есть вариант, который вам еще не предлагали (не судите строго)  smile 

возложите свои проблемы на БД, при этом проверяйте так, 
select slovo FROM slovar WHERE slovo='mama' or slovo='myla' or slovo='ramy' 
то есть не по одному слову, а предложениями, а затем уже результат сравнивайте "ручкими"...
PM MAIL   Вверх
Suppir
Дата 6.4.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



По базам данных поиск намного медленней, чем по словарю в оперативной памяти, имхо. 
PM MAIL   Вверх
500mhz
Дата 6.4.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



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


--------------------

PM MAIL ICQ   Вверх
Suppir
Дата 6.4.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



"зафигачить весь словарь (каждое слово) в crc32"

можно поподробнее?

Добавлено через 1 минуту и 51 секунду
Дело в том, что мне потом не одно слово нужно будет искать в словаре, а много миллионов слов проверять через этот словарь. Если для каждого слова еще вычислять контрольную сумму, то, боюсь, это будет медленней работать, чем просто поиск по словарю. 
PM MAIL   Вверх
500mhz
Дата 6.4.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Ну к примеру в словаре слово "макулатура" занимает 10 байт + 1 как идентификатор конец строки (в лучшем случае) и того 11 байт которые нада сверить.

Вместо слова храним его crc - контрольную сумму которая займет всего 4 байта.
Соответственно при проверке текста , берем слово из текста, получаем его crc32 и сверяем с нашей базой-словарем.
Если есть то есть, а если нет то нет )


--------------------

PM MAIL ICQ   Вверх
Suppir
Дата 6.4.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Если одно слово нужно сверить, то понятно. Но если нужно несколько миллионов слов сверять со словарем, то нужно каждое слово конвертировать в этот crc. 
PM MAIL   Вверх
500mhz
Дата 6.4.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Нифига, словарь ты готовиш заранее, а вычесление контрольной суммы строки/слова не процессороемкая задача.
А вот сравнение двух строк очень даже.
Грубо говоря не вникая в архитиктуру, сравнение двух 4 байтовых значений процессор сделает всего  1 операцией, а сравнение строки из 10 байт за 10.

Это сообщение отредактировал(а) 500mhz - 6.4.2012, 14:57


--------------------

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.