Bei einer Reihe solcher Formeln:
bacb
bcab
cbba
abbc
Geben Sie einen Algorithmus an, der die Anzahl der eindeutigen Ergebnisse ermittelt, die Sie erhalten können, wenn jede Variable in jeder Formel durch "0" oder "1" ersetzt wird.
Es gibt (k!)^2
Formeln mit 2k-1
Variablen und k^2
Begriffen. Drücken Sie Ihre Asymptotik in Bezug auf aus k
.
Der schnellste Algorithmus gewinnt. Im Falle eines Unentschieden gewinnt die Lösung mit geringerer asymptotischer Speichernutzung. Wenn das immer noch ein Unentschieden ist, gewinnt der erste Beitrag.
Für das obige Beispiel können die folgenden Ergebnisse durch Ersetzen der Variablen erhalten werden:
1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111
Die richtige Antwort lautet also 12. 1010
Kann unter anderem nicht mit den oben genannten Formeln gemacht werden.
Ich habe drei weitere Testfälle mit entsprechenden Lösungen von 230 , 12076 und 1446672 erstellt .
a
,b
... ist eine Variable ? Und wir haben immer nur eine ungerade Anzahl von Variablen? Ist es nicht wichtig, wie lang die Folge von Variablen ist und wie viele Formeln Sie erhalten?Antworten:
Mathematica, O (k ^ 2 (k!) ^ 2) Zeit
Hoffentlich habe ich die Zeitkomplexität richtig berechnet. Eingabe ist eine Liste von Formeln wie z
{"bacb","bcab","cbba","abbc"}
. Läuft für jeden Testfall auf meinem Computer in weniger als 30 Sekunden, aber wen interessieren die absoluten Zeiten?Erläuterung:
&
macht das am Ende es zu einer reinen Funktion,#
wobei auf das erste Argument Bezug genommen wird#2
, das zweite Argument ist usw.Length[*..*]
nimmt die Länge der darin enthaltenen Liste.Union@@(*..*)
Nimmt die enthaltene Liste und liefert sie als Argumente fürUnion
, wodurch eine Liste der eindeutigen Elemente in einem ihrer Argumente zurückgegeben wird.*..*&/@#
nimmt eine reine Funktion und ordnet sie der Liste der Formeln zu, so dass{a,b,c}
wird{f[a],f[b],f[c]}
. Beachten Sie, dass in verschachtelten reinen Funktionen#n
auf die innersten Argumente verwiesen wird.Fold[*..*&,#,*..*]
Nimmt eine Akkumulatorfunktion, einen Startwert und eine Liste und kehrt zurückf[f[...[f[starting value,l_1],l_2],...],l_n]
.Union[Characters[#]]
Nimmt alle Zeichen in der aktuellen Formel und erhält alle eindeutigen Elemente, wodurch wir die Variablen erhalten.Flatten[*..*]
glättet sein Argument, so dass das{{{a},b},{{c,{d}}}}
wird{a,b,c,d}
.{*..*,*..*}
ist einfach eine Möglichkeit, die beiden Ergebnisse mit den oben genannten zu kombinierenFlatten
.StringReplace[#,#2->"0/1"]
Nimmt das vorherige Ergebnis und gibt es zurück, wobei die aktuelle Variable durch entweder0
oder ersetzt wird1
.quelle
k
in Ihrer Zeit als Variable? Trotzdem faktorielle Zeit! Puh!k
." Außerdem musste ichGeneralUtilities`Benchmark
für jede verwendete Methode eine machen.