set.find() - быстрый?
От: Аноним  
Дата: 08.11.07 03:22
Оценка: :)
Здраствуйте.
Мне нужно где то хранить строки и потом проверять, есть ли такая строка в этом хранилище.
set.find() как работает, перебирает по порядку значения или по алфавиту? может стоит что-то своё написать из-за тормознутости сета?

и еще вот вопрос, как лучше сделать,
так:
set<string> vec;
vec.insert("abc");

if (vec.find("abc") != vec.end()) {
    cout << "true\n";
}

или так:
set<string> vec;
vec.insert("abc");

if (*(vec.find("abc")) == "abc") {
cout << "true\n";
}
[/ccode]
?
заранее спасибо.
Re: set.find() - быстрый?
От: jazzer Россия Skype: enerjazzer
Дата: 08.11.07 03:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>Мне нужно где то хранить строки и потом проверять, есть ли такая строка в этом хранилище.
А>set.find() как работает, перебирает по порядку значения или по алфавиту? может стоит что-то своё написать из-за тормознутости сета?

сложность поиска логарифмическая.

А>и еще вот вопрос, как лучше сделать,

А>так:
А>
А>set<string> vec;
А>vec.insert("abc");

А>if (vec.find("abc") != vec.end()) {
А>    cout << "true\n";
А>}
А>

А>или так:
А>set<string> vec;
А>vec.insert("abc");

А>if (*(vec.find("abc")) == "abc") {

А> cout << "true\n";
А>}
А>[/ccode]
А>?
А>заранее спасибо.

первое.
второе просто неправильное, так как есть вероятность разыменовать итератор end, что запрещено.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: set.find() - быстрый?
От: Аноним  
Дата: 08.11.07 04:46
Оценка:
Здравствуйте, jazzer, Вы писали:

J>сложность поиска логарифмическая.


а что это означает?
я просто в школе плохо учился
Re[2]: set.find() - быстрый?
От: Кодт Россия  
Дата: 08.11.07 11:42
Оценка:
Здравствуйте, jazzer, Вы писали:

J>сложность поиска логарифмическая.


Уточним: O(log(N)*S), где N — количество строк, S — длина. Поскольку сравнение строк происходит посимвольно.

Если поиск является узким местом, то лучше использовать хэш-таблицу.
Или хотя бы set< pair<int,string> >, где первое поле — хэш от второго.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: set.find() - быстрый?
От: Кодт Россия  
Дата: 08.11.07 11:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

J>>сложность поиска логарифмическая.


А>а что это означает?

А>я просто в школе плохо учился

Лучше всего, если ты возьмёшь какой-нибудь учебник по алгоритмам — Кормена или Седжвика, хотя бы.
Там вопросы оценки сложности алгоритмов освещены.

Если говорить просто, то время и расход памяти любого алгоритма можно представить как функцию от количества входных данных.
Например, линейный поиск (перебор от начала до конца) — тратит N*C времени (N элементов и C на каждый элемент и на переход между элементами). Константа C варьируется в зависимости от реализации, поэтому пишут O(N) — нечто, линейно зависимое от N.
Двоичный поиск тратит log2(N)*C2, троичный — log3(N)*C3, и т.п., но поскольку log_b(x) = ln(x)/ln(b), основание логарифма можно вынести в константу.
Несмотря на то, что C могут быть очень большими, всё равно начиная с некоторого достаточно большого количества N выполнится условие N*C > log2(N)*C2. Это значит, что на больших наборах двоичный поиск эффективнее линейного. А вот что эффективнее — конкретная реализация двоичного или конкретная реализация троичного поиска — это нужно смотреть.

Подробнее — ищи по ключевому слову "асимптотика".
В школе, увы, такие вопросы не освещаются... хотя, может, и освещаются в последнем классе.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: set.find() - быстрый?
От: Большой 40wt Светляк Россия http://svetlyak.ru
Дата: 08.11.07 13:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>и еще вот вопрос, как лучше сделать,


В данном случае, лучше сделать так:

cout << "true" << endl;


--
Jabber: art@svetlyak.ru
Site: <a href="http://svetlyak.ru">http://svetlyak.ru</a>
Re: set.find() - быстрый?
От: ilnar Россия  
Дата: 09.11.07 07:59
Оценка:
Здравствуйте, Аноним, Вы писали:

с set быстрее (если не вдаваться в подробности мелких объемов)
только зачем ты там написал разыменовывание? jazzer об этом уже сказал
пиши как и в первом случае, и будет тебе счастье (кроме случаев особо хитрых своих предикатов сравнения).
работу с cout тоже поправь, как писали

[/ccode]
if (vec.find("abc") != vec.end()) {
[/ccode]
Re: set.find() - быстрый?
От: Аноним  
Дата: 19.11.07 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.

А>Мне нужно где то хранить строки и потом проверять, есть ли такая строка в этом хранилище.
А>set.find() как работает, перебирает по порядку значения или по алфавиту?
А>может стоит что-то своё написать из-за тормознутости сета?
Тебе профайлер сказал, что оно тормозит? Если нет, то не майся дурью.
В качестве варианта используй std::tr1::unordered_set.
Re[3]: set.find() - быстрый?
От: Alex Alexandrov США  
Дата: 19.11.07 18:35
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Если поиск является узким местом, то лучше использовать хэш-таблицу.


Или какое-нибудь префиксное дерево. Недавно, собственно, читал интересные заметки про то, как Trie и Hash Table пиписьками мерялись.
It's kind of fun to do the impossible (Walt Disney)
Re[4]: set.find() - быстрый?
От: Кодт Россия  
Дата: 19.11.07 19:37
Оценка:
Здравствуйте, Alex Alexandrov, Вы писали:

AA> Недавно, собственно, читал интересные заметки про то, как [url]Trie и Hash Table пиписьками мерялись[/url].

Ну и как они мерялись? Слайды! Слайды!
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[5]: set.find() - быстрый?
От: Alex Alexandrov США  
Дата: 19.11.07 20:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Alex Alexandrov, Вы писали:


AA>> Недавно, собственно, читал интересные заметки про то, как [url]Trie и Hash Table пиписьками мерялись[/url].

К>Ну и как они мерялись? Слайды! Слайды!

От блин, елки-палки... Попытка номер два: Сказ про то, как Trie и Hash Table силушкой мерялись.
It's kind of fun to do the impossible (Walt Disney)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.