Вычисление CRC наверняка будет медленнее, чем любое отдельное сравнение строк, но вы можете рассчитывать на сравнение log2N перед поиском ключа (например, 10 сравнений на 1000 ключей), поэтому это зависит от размера вашего map
.CRC также может привести к коллизиям, поэтому он подвержен ошибкам (вы можете относительно легко обнаружить коллизии, и, возможно, даже обработать их, чтобы получить правильные результаты в любом случае, но вы должны быть очень осторожны, чтобы сделать их правильными).
Вы можете попробовать unordered_map<>
(возможно, называется hash_map
), если ваша среда C ++ предоставляет такую возможность - она может быть или не быть быстрее, но не будет отсортирована, если вы выполняете итерацию.Хеш-карты являются еще одним компромиссом:
- время хеширования, вероятно, аналогично времени для вашего CRC, но
- впоследствии они часто могут искать непосредственно значение, вместо того, чтобывыполнить бинарное дерево в карте нормалей
- , они разбивают немного логики для обработки коллизий.
(Глупо, но если вы можете продолжать использовать целые числа и они могут быть смежными, тогда помните, что вы можете заменить поиск массивом, который намного быстрее. Если целые числа на самом деле не являются смежными, но не очень разреженными, вы можете использовать разреженный индекс, например, массивиз 10000 коротких целых, которые являются индексами в 1000 упакованных записей).
Суть в том, что если вам нужно спросить, вы должны реализовать эти альтернативы и сравнить их спосмотрите, какие из них действительно лучше всего работают с вашим конкретным приложением, и действительно ли они имеют какое-либо ощутимое значение.Любой из них может быть лучшим в определенных обстоятельствах, и если вам недостаточно внимания, чтобы серьезно их сравнить, это однозначно означает, что подойдет любой из них.