В первую очередь вы должны иметь возможность определить ваши параметры. Вы также сказали нам, что основной интересующий вас шаблон использования - это поиск , а не вставка.
Позвольте N
быть числом строк, которое вы ожидаете иметь в таблице, и пусть C
будет средним числом символов в любой данной строке, представленной в указанной таблице (или в строках которые сверяются с таблицей).
В случае подхода на основе хеша , за каждый поиск вы оплачиваете следующие расходы:
O(C)
- вычисление хэша для строки, которую вы собираетесь найти
- между
O(1 x C)
и O(N x C)
, где 1..N
- это цена, которую вы ожидаете от обхода сегмента на основе хеш-ключа, здесь умноженная на C
для повторной проверки символов в каждой строке на соответствие ключу поиска
- общее время: от
O(2 x C)
до O((N + 1) x C)
В случае подхода std::map
(в котором используются красно-черные деревья), за каждый поиск вы платите следующие расходы:
- общее время: между
O(1 x C)
и O(log(N) x C)
- где O(log(N))
- максимальная стоимость обхода дерева, а O(C)
- время, которое универсальная less<>
реализация std::map
берет для перепроверки вашего ключа поиска при обходе дерева
В случае больших значений для N
и при отсутствии хеш-функции, которая гарантирует коллизии меньше, чем log (N), или, если вы просто хотите воспроизвести ее безопасно, лучше использовать основанный на деревьях (std::map
) подход . Если N мало, во что бы то ни стало, используйте подход, основанный на хешировании (все же следя за тем, чтобы коллизия хешей была низкой).
Однако, прежде чем принимать какое-либо решение, вам также следует проверить: