CMPH может быть тем, что вы ищете. В основном это gperf
без необходимости установки во время компиляции.
Хотя, конечно, std::unordered_map
, как в C++11, тоже может подойти, хотя, возможно, с несколькими коллизиями.
Так как вы ищете строки, для строк, trie (любой из различных вариантов trie, crit-bit или любые другие причудливые имена, которые у них есть) также может быть полезно изучить, особенно если у вас их много . В свободном доступе есть много бесплатных реализаций trie.
Преимущество try в том, что они могут индексировать и сжимать строки, поэтому они используют меньше памяти, что повышает вероятность наличия данных в кеше. Кроме того, шаблон доступа менее случайный, что также способствует кэшированию. Хеш-таблица должна хранить значение плюс хэш и индексировать более или менее случайным образом (не случайно, а непредсказуемо) в памяти. Структура, подобная trie/trie, в идеале нуждается только в одном дополнительном бите, который отличает ключ от его общего префикса в каждом узле.
(Обратите внимание, кстати, что O(log(N)) вполне может быть быстрее, чем O(1) в таком случае, потому что big-O не учитывает такие вещи.)
person
Damon
schedule
08.12.2011