Я отправляю другой ответ, потому что получил новое (и лучшее предложение):
- Сортировка кодовой книги по значению
- Для каждого кода, который вы ищете, сначала выполните бинарный поиск по нижней границе, чтобы найти первое возможное совпадение (любое значение меньше, чем то, что вы ищете, не может быть совпадением)
- Поиск в диапазоне от первого возможного совпадения до последнего элемента и включая его, чтобы увидеть, есть ли совпадения.
Алгоритм все еще линейный, но с поиском O (log N) для обрезания (надеюсь) большинства значений. Поиск по маленьким значениям все равно будет дорогим, поиск по большим значениям будет дешевле.
Вы также можете возможно использовать фильтр Блума , чтобы выполнить начальный поиск, чтобы отключить большинство случаев, и выполнить линейный поиск по остальным. Фильтр может иметь ложные срабатывания, поэтому вам придется выполнять линейный поиск, когда фильтр возвращает значение true. Эта структура данных требует от вас наличия большого количества независимых хеш-функций (например, на основе количества установленных битов, произведения всех установленных битов, нечетного и четного, самого числа и т. Д.). Это может быть хорошей оптимизацией, если вы ожидаете, что коды будут найдены только изредка (если фильтр возвращает false, код гарантированно не будет в кодовой книге). Однако я подозреваю, что это скорее теоретический интерес, чем реальная оптимизация.