Testen Sie, wenn eine Ganzzahl K vorhanden ist, um eine Sequenz hinzuzufügen, um es zu einer anderen Sequenz zu schaffen
-
28-09-2020 - |
Frage
Angenommen, diese Reihenfolge
Wie hoch ist der schnellste Algorithmus, um festzustellen, ob ein Integer $ K $ existiert, so dass die Sequenz $ A_1 + K, A_2 + K, A_3 + K, \ ldots, a_n + k $ ist eine Anderwirkung der Sequenz $ B $ ?
Hier ist ein naiver Algorithmus, der
Ich kam auf dieses Problem, während ich versuchte, zwei binäre Bilder mitzuteilen (Prüfung, ob ein Bild den anderen enthält).
Lösung
Hier ist eine Heuristik, die nicht immer funktioniert, sondern mit hoher Wahrscheinlichkeit arbeiten sollte, wenn die Ganzzahlen in den Arrays zufällig von einem großen Speicherplatz ausgewählt werden.
Initialisieren Sie einen Hashtable von Zählungen $ C $ an alle Nullen. Wiederholen Sie dann $ T $ mal: Zufällig auswählen $ i, j $ , berechnen $ b_j-a_i $ und inkrementieren Sie $ C [B_J-A_I] $ . Sortieren Sie schließlich $ C $ nach Zählungen, von größter Zählung bis zum Kleinsten; Dann probieren Sie für jeden der größten Werte von $ C [k '] $ , probieren Sie $ k' $ Als Erraten bei $ K $ und bestätigen Sie jede Vermutung.
Beachten Sie, dass in jeder Iteration die Wahrscheinlichkeit der Inkrementierung von $ C [k] $ mindestens
Wie groß muss $ T $ sein? Ich erwarte, dass
Dies ist nur eine Heuristik, und es wird sicherlich eingaben, in denen es fehlschlägt.
Andere Tipps
Hier ist ein Algorithmus, der in $ \ Mathcal {O} ausgeführt wird (n \ sqrt {n} + m \ log m) $ Time.
$ W $ Bezeichnen Sie die Funktion, die für Integer $ T $ , zählt die Anzahl der Paare dass ihr Unterschied $ T $ : $ w (t)=land \ {(x, y): x \ In a, y \ in b, yx= t \ \} \ rutzet $ . Wenn wir Zugriff auf $ w (t) $ hätten, können wir einfach sein Maximum finden und sehen, ob es $ n $ ist oder nicht. Die Hauptidee ist, $ W $ mit der Fast Fourier-Transformation zu schätzen. Wenn die Zahlen begrenzt sind, ergibt er die genaue Lösung, andernfalls kann man Modul mit einer ausreichend großen Anzahl verwenden und dann die Lösungen überprüfen, sobald sie gefunden wurden.
lass $ n, M $ Ganzzungen sein (später definiert) und $ u, v \ in \ mathbb {r} ^ n $ Seien Sie als Vektoren definiert als
Wenn die Zahlen in beiden Sätzen von $ N $ begrenzt sind, ist dies eine genaue Lösung.
Wenn Sie jedoch
Es gibt zwei Möglichkeiten, um dies zu verbessern:
- .
- man kann $ \ log n $ separate Instanzen des Algorithmus ohne Überprüfung ausführen, und nehmen Sie die Kreuzung der maximalen Indizes, die $ W [I] \ GE N $ (nach dem Verschieben von $ M $ ). Wenn man zeigen kann, dass die Anzahl der gemeinsam genutzten Kollisionen von $ 1/2 $ jedes Mal fällt, zeigt dies eine Gesamtlaufzeit von $ \ mathcal {O} (m \ log ^ 2 m) $ .
- man kann einen besseren Hash-Mechanismus für $ U $ und $ V $ und verwenden Höhere Momente für Markov und machen den Konzentrationsscheider.
Trotzdem, wenn Sie nach einer praktischen Lösung suchen, könnte dieser Algorithmus gut funktionieren. Zum Beispiel die Früchte
Dies ist ein völlig unterschiedlicher Algorithmus, den ich glaube, dass Arbeiten in $ O (m \ log M) $ schlechteste Fall und sollte für ganzzahlige oder reelle Zahlen arbeiten.
lassen Sie uns annehmen, dass $ A $ und $ B $ bereits in aufsteigender Reihenfolge vorhanden sind, sonst ausgeben
Der Rekursion hängt jedoch davon ab, wie eng $ A $ zu einem arithmetischen Fortschritt ist.
Lassen Sie förmlich per Periodizität
case i ( $ \ tau (a)
case ii ( $ \ tau (a)> n / 3 $ ) : per Definition, für $ s= N / 3 $ Es sollte einen Index
wlog übernehmen $ \ tau (A [1: 2n / 3)> N / 3 $ , und wählen Sie die untere Hälfte $ A '= a [1: n / 2] $ Um einzukommen (Andernfalls wählen Sie die obere Hälfte aus, die gleichen Argumente würden folgen).
Rekursiv berechnen $ i=Mathcal {A} (A ', B) $ . Für jeden Index $ i \ in i $ prüfen Sie, ob der Rest der Sequenz in $ B $ . Da beide Sequenzen sortiert sind, kann dies in $ O (N) $ für jeden Index erfolgen, der einen Gesamtbereich $ impliziert O (| i | \ cdot n) $ Zeit, um die gültigen Indizes zu berechnen und sie als
claim: $ | I | \ le 6m / n $ , was bedeutet, dass Lösungen nicht zu viel überlappen sind.
Nachweis des Anspruchs: wir zeigen $ | i |> 6m / n $ führt zu einem Widerspruch. Jeder Index $ i \ in i $ ist der Startpunkt eines Satzes von Indizes $ j_i= {i= j_1, \ dots, j_ {n / 2} \} \ SubseteQ B $ , diese Karte $ A '$ bis $ B $ bis zu einem Versatz. Spalte
Vortragsweise gibt es mindestens Lassen Sie $ S $ Seien Sie der Median der drei $ R . Da $ X \ in J_S $ und $ | j_s |= n / 2 $ , $ x $ Partitionen $ J_S $ bis zwei Teile, von denen eines weniger als $ N / 4 $ Indizes, die wir annehmen, ist der untere Teil:
Durch den Bau, $ s= j_1 $ wird auf $ A_1 $ bis zu $ a_ \ ell $ bis zu einem Versatz. Wir haben aber auch $ x \ in j_p $ , dies impliziert einen perforitor weniger als $ \ ell \ le n / 4 $ in $ A '$ , das $ \ tau (A')> N / 3 $ . (Es gibt ein paar Details, die ich später hinzufügen werde)