Für ein einfaches Problem mit einer Array-Länge von zunächst 5 (in der Praxis könnte die Array-Länge 20 betragen )
Ich habe eine vordefiniert eine Reihe von Mustern, wie AAAAB, AAABA, BAABC, BCAAA, ... . Jedes Muster hat die gleiche Länge wie das Eingabefeld . Ich bräuchte eine Funktion, die ein beliebiges Integer-Array als Eingabe nimmt und Folgendes zurückgibt todos die Muster, auf die es passt. ( ein Array kann mehreren Mustern entsprechen ) so schnell wie möglich.
" A " bedeutet, dass in dem Muster alle Zahlen an den Positionen von A gleich sind. z.B. AAAAA bedeutet einfach, dass alle Zahlen gleich sind, {1, 1, 1, 1, 1} passt zu AAAAA .
" B "bedeutet, dass die Zahl an den Positionen B nicht gleich der Zahl an der Position A ist (d. h. ein Platzhalter für eine Zahl, die nicht A ist). Die durch B dargestellten Zahlen müssen nicht gleich sein. . z.B. ABBAA bedeutet, dass die Zahlen 1, 4 und 5 gleich, sagen wir, x sind und die Zahlen 2 und 3 nicht gleich x sind. {2, 3, 4, 2, 2} passt zu ABBAA .
" C " bedeutet, dass diese Position eine beliebige Zahl sein kann (d. h. ein Platzhalter für eine Zahl). {1, 2, 3, 5, 1} passt zu ACBBA , {1, 1, 3, 5, 1} passt auch ACBBA
Ich bin auf der Suche nach einem effizienten (in Bezug auf die Anzahl der Vergleiche) Algorithmus. Er muss nicht optimal sein, sollte aber nicht zu weit vom Optimum entfernt sein. Ich denke, es ist eine Art von Entscheidungsbaum...
Eine sehr einfache, aber ineffiziente Methode ist die folgende:
-
Versuchen Sie, jedes Muster mit der Eingabe abzugleichen. say AABCA gegen {a, b, c, d, e} . Sie prüft, ob
(a=b=e && a!=c)
. -
Wenn die Anzahl der Muster n ist die Länge des Musters/Arrays m dann ist die Komplexität etwa O(n*m)
Aktualisierung:
Sie können gerne bessere Formulierungen für die Frage vorschlagen da ich nicht weiß, wie ich die Frage einfach und ohne Verwirrung verständlich machen kann.
Ein idealer Algorithmus müsste in irgendeiner Form vorbereitet werden, z. B. durch Umwandlung der Mustermenge in einen Entscheidungsbaum. Damit die Komplexität nach Die Vorverarbeitung kann für einige spezielle Mustersätze auf etwa O(log n * log m) reduziert werden (nur eine Vermutung).
Einige Zahlen, die vielleicht hilfreich sind: die vordefinierten Mustersätze sind ungefähr 30. Die Anzahl der Eingabefelder, die abgeglichen werden müssen, beträgt etwa 10 Millionen.
Zum Beispiel, wenn AAAAA y AAAAC befinden sich beide in dem vordefinierten Mustersatz. Wenn dann AAAAA Streichhölzer, AAAAC auch Spiele. Ich bin auf der Suche nach einem Algorithmus, der das erkennen kann.
Aktualisierung 2
Die Antwort von @Gareth Rees liefert eine O(n)-Lösung, allerdings unter der Annahme, dass es nicht viele " C "s. (sonst ist der Speicherplatz riesig und viele unnötige Vergleiche)
Ich würde mich auch über Ideen freuen, wie man mit Situationen umgehen kann, in denen es viele " C "s, sagen wir, für ein Eingabefeld der Länge 20, gibt es mindestens 10 " C "s für jedes vordefinierte Muster.