Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самый эффективный алгоритм поиска? Проверка орфографии... 
:(
    Опции темы
FiMa1
Дата 25.10.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Hi, all! Сразу говорю, в форуме читал все топики по данной теме... Собственно, есть словарь (>100.000 слов). Необходимо проверять орфографическую правильность введенного пользователем слова. Т.е., если слово присутствует в словаре, значит все правильно. Посоветуйте самый быстрый и эффективный алгоритм поиска слова в файле. Наподобие алгоритма Бойера-Мура, что ли...
PM   Вверх
FiMa1
Дата 25.10.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Просмотров 21, Ответов 0  smile 
PM   Вверх
Alexeis
Дата 25.10.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



FiMa1, самый эффективный по скорости или по занимаемой памяти?
Чем меньше жалеешь памяти тем быстрее можно искать, так что вопрос неоднозначный и наоборот.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
FiMa1
Дата 25.10.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Самый эффективный по скорости...
PM   Вверх
Rockie
Дата 25.10.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



FiMa1, полагаю для этого уже есть готовые решения. map из STL не подойдет? Как вариант - упорядоченное(отсортированное) дерево. imho поиск в этом случае будет очень быстрым.


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
FiMa1
Дата 25.10.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, Rockie. Сейчас загляну в STL. Однако хотелось бы написать самому. Мне бы вот только теорию какого-нибудь алгоритма...
PM   Вверх
Любитель
Дата 25.10.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



На вскидку, к сожалению, не отвечу.
Могу лишь посоветовать отправить это в раздел алгоритмов, т. к. здесь речь вроде не о реализации алгоритма на плюсах, а о самом алгоритме.


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(FiMa1 @  25.10.2006,  13:54 Найти цитируемый пост)
Самый эффективный по скорости... 

Тогда создаем многомерный массив, например
char data[33][33][33][33]; - каждое измерение - одна буква - 
1е измерение - 1ый символ
2е измерение - 2й символ

А в последнем будет массив строк начинающихся на первые 4 буквы.
Первая часть поиска вообще будет прямое индексирование
Пусть строка у нас
char s[]="строка";

тогда 

data[s[0]-'а'][s[1]-'а'][s[2]-'а'][s[3]-'а'] - даст список слов начинающихся на "стро", дальше 
можно классическим бинарным поиском найти в указанном списке нужное слово.

Можно еще ускорить поиск сделав массив 5-ти мерным, но при этом размер его будет 150Мб smile 
против 4.5 мб для 4-х мерного.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rockie
Дата 25.10.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

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



Цитата
Узел состоит из поля данных, которое является открытым (public) элементом, т.е. к которому можно обращаться непосредственно. Это позволяет читать или обновлять данные во время прохождения дерева, а также допускает возвращение ссылки на данные. Последняя особенность используется более сложными структурами данных, например, словарями.

Бинарные деревья

p.s.: однако imho не факт что при таком объеме данных есть необходимость в таких структурах, stl ведь тоже очень быстрый


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Любитель
Дата 25.10.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



std::map итак использует бинарные деревья  smile В некоторых версиях STL (расширенных) есть ещё более быстрые hash_map, также это чуда есть в бусте.


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 25.10.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Кстати, недавно столкнулся с тем, что std::hash_map ( реализация Dinkumware, С++ Builder 2006 ) работает во многих случаях медленнее, чем std::map.

Юзал конкретизацию std::(map/hash_map)< unsigned long, unsigned short>...

Количество объектов приблизительно 1000-10000...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
FiMa1
Дата 25.10.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пасиб всем за ответы... Я, конечно, писал 
Цитата

Самый эффективный по скорости... 

Однако же, alexeis1
Цитата

...размер его будет 150Мб 

Это жесть, ИМХО.. Все равно пасиб. Тема не закрыта. Даешь САМЫЙ быстрый алгоритм поиска в массы!?

Добавлено @ 15:36 
Тут вот нашел.. Алгоритмы поиска в тексте Мож кому интересно. А мне интересно ваше мнение по статье smile .
PM   Вверх
Любитель
Дата 25.10.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(JackYF @  25.10.2006,  15:26 Найти цитируемый пост)
Кстати, недавно столкнулся с тем, что std::hash_map ( реализация Dinkumware, С++ Builder 2006 ) работает во многих случаях медленнее, чем std::map.

В каких? Добавление/удаление должно быть по идее медленней, но поиск не в коем случае. Хотя это по идее - лично гарантировать не могу. Надо бы в очередной раз пожалуй устроить тестирование скорости и занимаемой различных контейнеров в различных версиях STL для различных библиотеках. Захотелось мне собрать отчёты по этой теме. Постараюсь подготовить.


--------------------
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 25.10.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Да но для 4-х мерного это всего 4.5 мб. 
Хотел же самый быстрый! - быстрее индексирования ничего нет. Это же прямое обращение без поиска! Любые известные алгоритмы типа хеша будут заведомо медленнее. В идеале, конечно, для каждого слова должен сразу вычисляться индекс в массиве и поиска как такового быть не должно. 
Можно объединить индексирование и хеш.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
FiMa1
Дата 25.10.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ok. Надо подумкать... Предложения принимаются...
PM   Вверх
maxim1000
Дата 25.10.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alexeis1 @  25.10.2006,  14:50 Найти цитируемый пост)
Да но для 4-х мерного это всего 4.5 мб. 

кстати, будет поменьше:
ведь некоторые буквосочетания в тексте встречаться не будут
например, если нет слов, начинающихся на "рл", то и соответствующий массив будет пустой

да и вообще можно выделить первые 4 символа в unsigned int (его уж точно хватит, пока разных используемых символов будет меньше 256) и сделать map (ну или hash_map) по нему...


--------------------
qqq
PM WWW   Вверх
SergeCpp
Дата 25.10.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

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



Вот, посмотрите...

Язык очень близок к C

Писал сам, на вопросы отвечу (сейчас тороплюсь...)

P.S. Очень быстро... В DOS-е работало на 386... Словарь и индексы не выложу... Есть на сайте...


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  SPELL.RAR 24,70 Kb
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 25.10.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(JackYF @  25.10.2006,  14:26 Найти цитируемый пост)
Кстати, недавно столкнулся с тем, что std::hash_map ( реализация Dinkumware, С++ Builder 2006 ) работает во многих случаях медленнее, чем std::map.

Скорее всего величина при инициализации/росте внутреннего массива разница у них. А так - поиск по хэшу ессно самое быстрое будет.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
JackYF
Дата 25.10.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



Не знаю... Я тоже думал так.

В моей функции большинство операций( на 2 порядка больше всего остального ) вызывается поиск по ключу и запись данных по найденному ключу... 

Возможно, реализация такая...

Лады, спасибо за ответы, подвопрос закрыт.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dov
Дата 25.10.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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





--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
FiMa1
Дата 26.10.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята, пасиб всем  smile ! Не ожидал такой активности... Dov, забавный топик.. Вдвойне забавно, что там ссылка, которую я приводил выше Алгоритмы поиска в тексте. Думаю, однако, остальные их предложения  не подходят для моего случая (объем слов более 100.000). Да они и сами признают:
Цитата

strstr() работает очень долго!  
Когда большие массивы сравнения и это ещё и в теле вложенных циклов, strstr() - это просто гигантский тормоз.
Для таких задач мне пришлось писать собственную реализацию...

Отдельная благодарность SergeCpp. Есть чему поучиться. Ковыряю сорец...

Добавлено @ 09:25 
Ребята, тем кто заинтересовался сабжем загляните по ссылкам, не пожалеете:
Точный поиск подстроки в строке
Краткий обзор алгоритмов

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


 
**


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

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



PM MAIL WWW ICQ   Вверх
Dov
Дата 27.10.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(FiMa1 @ 26.10.2006,  09:16)
 Думаю, однако, остальные их предложения  не подходят для моего случая (объем слов более 100.000).


FiMa1. ты видать до конца не дочитал, там народ > 1 000 000 (миллион) слов юзает, даже класс написали свой.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
FiMa1
Дата 27.10.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сорри, Dov! Ступил... smile  Топик супер. Thanks!
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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