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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что использовать для быстрого поиска? 
:(
    Опции темы
becks
Дата 7.9.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день коллеги, такой вопрос: 

Необходимо делать поиск слова в некотором множестве слов. Слов может быть от 50 до 1000. Допустим, что слова в множестве отсортированы. Необходимо определить входит искомое слово в данное множество или нет, важна СКОРОСТЬ определения. Подскажите, пожалуйста, как это множество мне лучше представить: использовать один из контейнеров stl, файл (тут плюс, что непосредственно пользователь может пополнять множество) или как-то еще. Повторюсь, главный акцент на скорости работы. Спасибо.


PM MAIL   Вверх
Леопольд
Дата 7.9.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



becks, если множество константно (т.е. не надо периодически его менять) то два варианта, 1-ый слегка побыстрее, 2-ой удобнее
1. std::vector, std::sort и std::find std::lower_bound | std::upper_bound(сложность поиска элемента будет O log2n : n размер контейнера)
2. std::set (сложность поиска элемента будет O log2n + xn : x оверхед на доступ к елементу)

Чтение из файла и работа с контейнером не исключают друг-друга. Читай файл в контейнер... В любом случае, работать с ОЗУ гораздо быстрее чем с ПЗУ в современных реалиях.

Это сообщение отредактировал(а) Леопольд - 7.9.2011, 15:55


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
newbee
Дата 7.9.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Еще можешь использовать хеш или одно из сбалансированных бинарных деревьев.


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 7.9.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Леопольд @  7.9.2011,  12:36 Найти цитируемый пост)
std::sort и std::find

лучше параллельные алгоритмы из GCC STL extension.
PM WWW   Вверх
Леопольд
Дата 7.9.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(becks @  7.9.2011,  12:18 Найти цитируемый пост)
Слов может быть от 50 до 1000.

boostcoder, из пушки по воробьям...


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Леопольд, не обратил внимание.
тогда в любом случае, считывание из файла будет в несколько раз дольше, чем самый левый поиск smile 
PM WWW   Вверх
azesmcar
Дата 7.9.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  7.9.2011,  12:36 Найти цитируемый пост)
1. std::vector, std::sort и std::find (сложность поиска элемента будет O log2n : n размер контейнера)

Не будет, для бинарного поиска одной сортировки массива недостаточно, алгоритм тоже нужно выбирать соответствующий smile 

PM   Вверх
Леопольд
Дата 7.9.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



azesmcar, если топикстартеру достаточно информации что слово в массиве есть, тогда std::binary_search подойдёт.
Цитата
Returns true if an element in the range [first,last) is equivalent to value, and false otherwise.
Если же ему нужен итератор, то нужен std::lower_bound | std::upper_bound... 

P.S. Что то погорячился я по поводу std::find... smile 

Это сообщение отредактировал(а) Леопольд - 7.9.2011, 15:54


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 7.9.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  7.9.2011,  15:51 Найти цитируемый пост)
если топикстартеру достаточно информации что слово в массиве есть, тогда std::binary_search подойдёт

Вроде бы ему это и нужно.
Цитата(becks @  7.9.2011,  12:18 Найти цитируемый пост)
Необходимо определить входит искомое слово в данное множество или нет


PM   Вверх
becks
Дата 7.9.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Леопольд @  7.9.2011,  15:51 Найти цитируемый пост)
azesmcar, если топикстартеру достаточно информации что слово в массиве есть, тогда std::binary_search подойдёт.


Да, мне это и нужно, огромное всем спасибо.
PM MAIL   Вверх
xvr
Дата 8.9.2011, 13:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(becks @  7.9.2011,  12:18 Найти цитируемый пост)
Необходимо определить входит искомое слово в данное множество или нет, важна СКОРОСТЬ определения.

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


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


pattern`щик
****


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

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



Цитата(xvr @  8.9.2011,  13:46 Найти цитируемый пост)
trie дерево

это что? гугл выдает всякий бред.
PM WWW   Вверх
azesmcar
Дата 8.9.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(boostcoder @  8.9.2011,  14:05 Найти цитируемый пост)
это что? гугл выдает всякий бред. 

http://en.wikipedia.org/wiki/Trie
PM   Вверх
boostcoder
Дата 8.9.2011, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(azesmcar @  8.9.2011,  14:07 Найти цитируемый пост)
http://en.wikipedia.org/wiki/Trie

спасибо.
прикольная структура.
PM WWW   Вверх
fish9370
Дата 8.9.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а как насчет перемешаных таблиц? на мой взгляд для этой задачи это более оптимальное решение..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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