У мене є кілька мільйонів 32-бітних значень. Для кожного значення я хочу знайти всі інші значення в межах відстані 5. У наївному підході для цього потрібні порівняння , яких я хочу уникати.
Я зрозумів, що якщо я просто ставлюся до цих 32-бітових значень як цілі числа і сортував список один раз, то значення, які відрізнялися лише найменшими значущими бітами, закінчуються дуже близько. Це дозволяє мені мати коротше "вікно" або діапазон чисел, в межах яких я можу виконати фактичні пара-зіставлення для точної відстані забивання. Однак, коли 2 значення змінюються лише у бітах вищого порядку, вони опиняються поза цим "вікном" і з'являються в протилежних кінцях відсортованого списку. Напр
11010010101001110001111001010110
01010010101001110001111001010110
було б дуже далеко один від одного, навіть якщо їх відстань забивання дорівнює 1. Оскільки відстань удару між двома значеннями зберігається при обертанні обох, я зрозумів, що, роблячи 32 обертання ліворуч і потім кожного разу сортуючи список, цілком ймовірно, що 2 значення виявиться достатньо близько в упорядкованому списку хоча б в одному з них.
Хоча такий підхід дає хороші результати, я намагаюся формально встановити правильність такого підходу.
З огляду на те, що я шукаю відповідні значення, що мають відстань kming ham або менше, чи дійсно мені потрібно зробити всі 32 бітові обертання? Наприклад, якщо а розмір вікна - 1000, мені потрібно робити максимум 24-бітові обертання, оскільки навіть якщо бродячий біт з'явився в будь-якому з 8 бітів нижчого порядку, отримані цифри не будуть відрізнятися більш ніж на 1000.k = 1
A[i].close