2013-09-27 21 views
11

Ich habe eine sehr lange Sequenz von Bits, genannt A, und eine kürzere Sequenz von Bits, x. Zwei Bitfolgen derselben Länge werden unscharf abgeglichen, wenn nach dem Ausrichten k oder weniger nicht übereinstimmende Bits vorhanden sind. Ich möchte alle solche unscharfen Vorkommen von x innerhalb von A finden.Fuzzy-Bit-Matching

Bisher habe ich den naiven Ansatz ausprobiert. Schleife durch A, dann für jedes Bit, Schleife durch die Länge von x, Zähle die Anzahl der nicht übereinstimmenden Bits beginnend an dieser Position in A, und wenn es k nicht überschreitet, berichte diese Position. Dieser Algorithmus ist nicht effizient. Wenn A n_A Bits hat und x n_x Bits hat, ist die Laufzeit O(n_A * n_x).

Mir wurde gesagt, dass dies in O(n_A * log(n_A)) unabhängig von k getan werden kann. Der bereitgestellte Hinweis besteht darin, die schnelle Fourier-Transformation zu verwenden. Denken Sie daran, dass für zwei Eingänge enter image description here und enter image description here, Faltung zu Polynommultiplikation enter image description here wo

qqn

ähnlich produziert. Es ist mir nicht klar, wie ich diesen Hinweis verwenden soll. Jede Hilfe würde sehr geschätzt werden.

Antwort

4

Umkehren x, ersetzen Sie jedes Bit b durch (-1) ** b, und falten Sie. Ich werde dich auf deinen Hausaufgaben erklären lassen, was als nächstes zu tun ist.

+0

Super! Vielen Dank. Es macht jetzt sehr viel Sinn :) – darksky

+0

Ich denke, was du hier meinst, ist nur 0s durch -1 zu ersetzen. In der Tat sollten wir das Bit b durch - (- 1)^b ersetzen. Aber ich habe das Problem mit diesem Trick gelöst. Ich werde meine eigene Lösung in ein paar Tagen veröffentlichen, um zu erklären, warum es funktioniert, wenn niemand antwortet. – darksky

+0

Entschuldigung, dass du deine tolle Partitur von '4444' zerstörst, aber das ist ein guter Hinweis - und offensichtlich für das OP gearbeitet. – Floris