Если вы хотите посмотреть, скажем, 50, наиболее подходящих шаблонов, и мы можем предположить, что набор входных данных довольно статичен (или может быть динамически обновлен), вы можете повторить начальную фазу предыдущего комментария, так:
- Для каждого битового набора подсчитайте биты.
- Сохранение битовых комбинаций в multi_map (если вы используете STL, в Java, вероятно, есть что-то похожее)
Затем используйте следующий алгоритм:
- Создайте 2 коллекции: одну для хранения найденных шаблонов, другую для хранения, возможно, хороших шаблонов (эта вторая коллекция, вероятно, должна быть картой, отображающей «расстояния» для шаблонов)
- Возьмите свой собственный шаблон и сосчитайте биты, предположите, что это N
- Посмотрите в мультикарте на индекс N, все эти шаблоны будут иметь одинаковую сумму, но не обязательно будут полностью идентичными
- Сравните все шаблоны по индексу N. Если они равны, сохраните результат в первой коллекции. Если они не равны, сохраните результат во второй коллекции / карте, используя разницу в качестве ключа.
- Посмотрите в мультикарте на индекс N-1, все эти шаблоны будут иметь расстояние 1 или более
- Сравните все шаблоны по индексу N-1. Если они имеют расстояние 1, сохраните их в первой коллекции. Если они имеют большее расстояние, сохраните результат во второй коллекции / карте, используя разницу в качестве ключа.
- Повторите для индекса N + 1
- Теперь посмотрите во второй коллекции / карте и посмотрите, есть ли что-то, сохраненное на расстоянии 1. Если это так, удалите их из второй коллекции / карты и сохраните их в первой коллекции.
Повторяйте это для расстояния 2, расстояния 3, ... пока у вас не будет достаточно паттернов.
Если количество требуемых шаблонов не слишком велико, а среднее расстояние также не слишком велико, то число реальных сравнений между шаблонами, вероятно, составляет всего несколько%.
К сожалению, поскольку шаблоны будут распределяться с использованием гауссовой кривой, все еще будет довольно много шаблонов для проверки. Я не делал математической проверки, но на практике, если вы не хотите, чтобы из миллионов было слишком много паттернов, а среднее расстояние не слишком далеко, вы сможете найти множество наиболее близких шаблонов, проверяя только несколько процентов от общего количества битовых шаблонов.
Пожалуйста, держите меня в курсе ваших результатов.