S>typedef map< string, int, less< int > > IntList; S>IntList intList; S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
Здравствуйте, sergey2b, Вы писали:
S>мне надо хранить список значений строка-число S>использую для этого map
S>typedef map< string, int, less< int > > IntList;
странное какое-то объявление. не находите? Почему там less<int>, а не less<string>?
S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
при вашей постановке вопроса получается что кроме std::map ничего использовать нельзя и требуется ускорить чтение из std::map.
Правильно я понял вопрос?
Здравствуйте, sergey2b, Вы писали:
S>мне надо хранить список значений строка-число S>использую для этого map
S>typedef map< string, int, less< int > > IntList; S>IntList intList;
S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
Можно попробовать использовать троичное дерево поиска вместо мэпа. Или, как уже говорили, хэштаблицу.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
K>странное какое-то объявление. не находите? Почему там less<int>, а не less<string>?
вы правы
K>при вашей постановке вопроса получается что кроме std::map ничего использовать нельзя и требуется ускорить чтение из std::map. K>Правильно я понял вопрос?
нет можно использовать что угодно
делаю кешь для хранения ключь стринг — значение int
будет примерно 100k записей, время вставки несильно критично, желательно уменьшить время чтения
любой wrote:
> Лучше всего ипользовать trie. Например Patricia trie. Где взять — не > знаю. Я сам себе написал.
Так внутри мапы дерево и сидит как раз.
Автор, тебе не подходит O(log N) ? Сколько ж тебе надо ?
Ну если не подходит, ищи реализацию хэштаблиц, они O(1),
да только вот беда -- статистически нестабильна производительность на
произвольных ключах. Может деградировать в O(N) например.
Из реализаций говорят есть hashmap-ы a la STD в некоторых
реализациях STL
Здравствуйте, MasterZiv, Вы писали:
>> Лучше всего ипользовать trie. Например Patricia trie. Где взять — не >> знаю. Я сам себе написал.
MZ>Так внутри мапы дерево и сидит как раз.
Грубо говоря, внутри map<string, int> в качестве ключей сидит строка, а внутри специализированных деревьев — буква.
Соответственно, std::map им не конкурент ни по скорости, ни по памяти.
А уж если нужен поиск с частичным совпадением, например, для автокомплита, то std::map вообще не годится.
MZ>Автор, тебе не подходит O(log N) ? Сколько ж тебе надо ?
MZ>Ну если не подходит, ищи реализацию хэштаблиц, они O(1), MZ>да только вот беда -- статистически нестабильна производительность на MZ>произвольных ключах. Может деградировать в O(N) например. MZ>Из реализаций говорят есть hashmap-ы a la STD в некоторых MZ>реализациях STL
std::tr1::unordered_map уже вполне стандартна.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
MZ>Автор, тебе не подходит O(log N) ? Сколько ж тебе надо ? MZ>Ну если не подходит, ищи реализацию хэштаблиц, они O(1),
то что хэши O(1) это самообман. Они O(1) если считать что вычисление хэша это константная операция. Но понятно, что с ростом N понадобится увеличивать битность хэша, а значит и операцию вычисления хэша. так что там тот же логарифм спрятан. Обосновывать хорошесть хэшей тем что они O(1) а дерево O(log N) это лукавство. Если хэш и лучше, то он лучше именно на практике, а не теоретически.
Здравствуйте, sergey2b, Вы писали:
S>мне надо хранить список значений строка-число S>использую для этого map
S>typedef map< string, int, less< int > > IntList; S>IntList intList;
S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>Грубо говоря, внутри map<string, int> в качестве ключей сидит строка, а внутри специализированных деревьев — буква.
У Patricia trie даже не буквы, а биты сидят. Причём только те, которые значимы для процесса поиска в заданном наборе строк.
Здравствуйте, sergey2b, Вы писали:
S>мне надо хранить список значений строка-число S>использую для этого map
S>typedef map< string, int, less< int > > IntList; S>IntList intList;
S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
Если алфавитная сортировка не принципиальна, то можно сперва сравнивать длины строк, а потом сами строки, да ещё и попеременно с начала и с конца, чтобы минимизировать количество сравнений:
Здравствуйте, Тот кто сидит в пруду, Вы писали:
ТКС>А уж если нужен поиск с частичным совпадением, например, для автокомплита, то std::map вообще не годится.
подскажите пожалуйста что можно почитать как делать поиск по ключу с частиным совпадением
например типа "ab*fg*k" где * любые символы
надо не для этой задачи но интерестно понять как такое можно сделать (про agrep я знаю но он не подходит так как template поиска может быть неесколько)
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, c-smile, Вы писали:
CS>>Ternary tree (trie) CS>>Имплементация здесь: CS>>http://rsdn.ru/forum/src/824201.1.aspx
RB>Интересно.
RB>Сделал пробную реализацию. RB>Сделал тест на 1 млн слов (числовые последовательности).
Для больших наборов уже начинает играть роль cache misses и всё такое прочее.
RB>Результат по скорости оказался идентичный использованию std::map с числовым ключом и использования crc32 для вычисления ключа по строке. RB>Такие дела...
Я не понял что это за конструкция и что дает crc32
CS>>Скорость нахождения значения пропорциональна только длине строки. Т.е. O(1) best и worst case.
RB>Это неверно.
А неверно что именно?
Каждый символ входной строки просматривается ровно один раз. Т.е. никаих log(n) strcmp нет.
RB>Также зависит от результата построения дерева, который зависит от количества слов и порядка их вставки.
Там в моей статье есть ссылка на эту вот статью в Dr.Dobb: http://www.drdobbs.com/184410528
по которой все и делалось в своё время. Там порядок вставки освещен.
Здравствуйте, c-smile, Вы писали:
CS>Для больших наборов уже начинает играть роль cache misses и всё такое прочее.
Мы говорим о ternary tree?
Что ты называешь "cache misses"?
CS>Я не понял что это за конструкция и что дает crc32
Обычный map из STL.
Только ключом вместо строк выступают соответствующие им уникальные числовые идентификаторы.
Для простоты взял crc32, хотя есть и более эффективные варианты.
CS>Каждый символ входной строки просматривается ровно один раз. Т.е. никаих log(n) strcmp нет.
Это верно.
Только многие (в общем случае каждый) из этих символов придется сравнить с большим количеством символов промежуточных нод дерева, которые задают "маршрут" до конечного "листа". И длина такого "маршрута" (и общее количество сравнений) будет зависеть от количества элементов и порядка вставки слов, т.е. от полученной структуры дерева.
Конечно, это будет быстрее, чем использовать строковые ключи в мапе и strcmp, но ведь можно же использовать уникальные числовые коды строк. Выигрыш у ternary tree есть, но буквально доли процента.
CS>Там в моей статье есть ссылка на эту вот статью в Dr.Dobb: http://www.drdobbs.com/184410528 CS>по которой все и делалось в своё время. Там порядок вставки освещен.
Ну, если важна только скорость чтения, а порядок вставки можно "регулировать", то, наверно, будет быстрее. Меня интересовала структура для "общего" использования, когда порядок вставки и набор слов неизвестны заранее.
Здравствуйте, sergey2b, Вы писали:
S>подскажите пожалуйста есть ли возможность ускорить работу с map на чтение для такого случая
Ну например, если у вас достаточно часто происходит серия повторных обращений с одним и тем же ключем (а это типичная ситуация для некоторых случаев использования), можно запоминать ключ/результат последнего обращения и смотреть на него прежде, чем лезть в map.