Ich habe ein paar Millionen 32-Bit-Werte. Für jeden Wert möchte ich alle anderen Werte innerhalb eines Hamming-Abstands von 5 finden. Beim naiven Ansatz erfordert dies -Vergleiche, die ich vermeiden möchte.
Ich erkannte, dass, wenn ich diese 32-Bit-Werte nur als Ganzzahlen behandelte und die Liste einmal sortierte, Werte, die sich nur in den niedrigstwertigen Bits unterschieden, sehr nahe beieinander lagen. Dies ermöglicht mir ein kürzeres "Fenster" oder einen kürzeren Zahlenbereich, in dem ich tatsächliche paarweise Vergleiche für die genaue Hamming-Entfernung durchführen kann. Wenn jedoch 2 Werte nur in den Bits höherer Ordnung variieren, landen sie außerhalb dieses "Fensters" und erscheinen an entgegengesetzten Enden der sortierten Liste. Z.B
11010010101001110001111001010110
01010010101001110001111001010110
wäre sehr weit voneinander entfernt, obwohl ihre Hamming-Distanz 1 beträgt. Da die Hamming-Distanz zwischen 2 Werten erhalten bleibt, wenn beide gedreht werden, habe ich herausgefunden, dass es wahrscheinlich 32 Werte sind, wenn man 32 Linksdrehungen macht und dann die Liste jedes Mal sortiert wird in mindestens einer von ihnen nah genug in der sortierten Liste landen.
Obwohl dieser Ansatz gute Ergebnisse liefert, bemühe ich mich, die Richtigkeit dieses Ansatzes formal festzustellen.
Muss ich wirklich alle 32-Bit-Rotationen ausführen, da ich nach übereinstimmenden Werten mit einem Hamming-Abstand von oder weniger suche ? Wenn beispielsweise und meine Fenstergröße 1000 beträgt, muss ich maximal 24 Bit drehen, denn selbst wenn das Streubit in einem der 8 Bits niedrigerer Ordnung erscheint, unterscheiden sich die resultierenden Zahlen nicht um mehr als 1000.
A[i].close
?