Ich beschäftige mich mit einer problematischen Komplexitätsfrage über meine Universität:
Programmeingabe: A n x n
Array[][]
, die entweder mit 0
oder 1
gefüllt ist.
DEFINITION: Definieren Sie k
als SINK , wenn in der Zeile k
alle Werte 0
sind und in der Spalte k
alle Werte 1
(außer [k][k]
selbst muss 0
) sein
Programmausgabe: Gibt es eine k-Zahl, die ein SINK ist? Wenn ja, geben Sie k
zurück, sonst geben Sie -1
zurück.
Beispiel:
An Arr A k = 3 ist ein SINK, in Arr B gibt es kein SINK, also wird -1 zurückgegeben.
Das Hauptproblem bei dieser Aufgabe ist, dass die Komplexität des Programms unter O(n^2)
liegen muss. Ich habe es geschafft, dies mit dieser Komplexität zu lösen, indem ich über die schräge Linie die Zeilen und Spalten summiere. Ich habe keinen Weg gefunden, dies mit O(logn)
oder O(n)
zu lösen. Außerdem verhindert die Aufgabe die Verwendung eines anderen Arrays [] (aufgrund der Speicherkomplexität). Kann irgendjemand Licht in diese Sache fallen lassen? Danke im Voraus!
Um die Antwort, auf die sich harold in den OP-Kommentaren bezieht, explizit zu machen: Beginnen Sie mit einer Liste aller n
-Indizes, S = {0, 1, .., n-1}
. Dies sind unsere Kandidaten für Senken. Bei jedem Schritt eliminieren wir einen von ihnen.
S
, sagen wir i
und j
. A[i, j]
1 ist.
i
von S (weil die i Zeile nicht alle 0s ist, also kann i
nicht unsere Senke sein) j
von S (weil die j Spalte nicht alle 1s ist, also kann j
nicht unsere Senke sein) k
, überprüfen Sie, ob die k .te Zeile null ist und die k Spalte (außer A[k,k]
) ) sind alle Einsen.
k
eine Senke und Sie können sie zurückgeben. -1
zurückgeben. Es gibt n
elements in S
, um mit zu beginnen, jeder Schritt eliminiert einen von ihnen und jeder Schritt benötigt konstante Zeit, also ist es O (n) insgesamt.
Sie erwähnen, dass Sie kein zweites Array verwenden möchten. Wenn das wirklich streng ist, können Sie stattdessen nur zwei ganze Zahlen verwenden, eine, die den "Überlebenden" aus dem letzten Schritt darstellt, und eine, die angibt, wie weit Sie in die Sequenz 0, 1, .., n-1 gehen sind.
Ich habe diesen Algorithmus noch nie zuvor gesehen und ich bin ziemlich beeindruckt von seiner Einfachheit. Prost.