Titel gibt die Frage an.
Wir haben als Eingaben eine Liste von Elementen, die wir vergleichen können (bestimmen, welches das größte ist ). Kein Element kann gleich sein.
Wichtige Punkte:
- Der Vergleich ist nicht transitiv (denken Sie an eine Steinpapierschere): Dies kann wahr sein: A> B, B> C, C> A (beachten Sie, dass dies keine gültige Eingabe ist, da es hier keine gültige Antwort gibt. nicht-transitiver Vergleich "bedeutet)
- Jedes Eingabearray hat garantiert eine Antwort
- Am größten bedeutet, dass das Element größer sein muss als jedes andere Element
- Umgekehrte Eigenschaft gilt, dh A> B impliziert, dass B <A
Beispiel:
Input: [A,B,C,D]
A > B, B > C, C > A
D > A, D > B, D > C
Output: D
Ich kann keinen Weg finden, dies in O (n) Zeit zu tun. Meine beste Lösung ist O (n ^ 2).
Ich bleibe bei jedem Ansatz hängen, da das Element explizit mit jedem anderen Element verglichen werden muss, um zu beweisen, dass es tatsächlich die Antwort ist (weil der Vergleich nicht transitiv ist).
Dies schließt die Verwendung eines Haufens, Sortieren usw. aus.
algorithms
time-complexity
sets
transitivity
James Wierzba
quelle
quelle
Antworten:
Der Standardalgorithmus zum Finden eines Maximums funktioniert immer noch. Beginnen Sie mit und gehen Sie die Elemente durch. Wenn Sie einen größeren Wert sehen, aktualisieren Sie das Maximum auf diesen Wert. Der Grund dafür ist, dass jedes übersprungene Element kleiner als mindestens ein Element ist und daher nicht das Maximum sein kann.a1
Um es klar auszudrücken, meine ich mit dem "Standardalgorithmus" Folgendes:
Der Vollständigkeit halber werde ich hier auf die in den Kommentaren angesprochenen Punkte eingehen. Die Einstellung in der obigen Diskussion wird ein Maximum in Bezug auf eine antisymmetrische Beziehung zu finden , wo ein i ein Maximum ist , wenn für alle j ≠ i haben wir einen i > ein j . Der obige Algorithmus funktioniert unter der Annahme, dass ein Maximum existiert. Wenn dies jedoch nicht bekannt ist, kann das Vorhandensein eines Maximums überprüft werden und in Ilmari Karonen antworten).< einich j ≠ i einich> aj
Wenn nicht unbedingt antisymmetrisch ist, schlägt der obige Algorithmus fehl (wie Emil in den Kommentaren erwähnt hat). Wenn < eine willkürliche Beziehung ist (dh wir lockern sowohl die Transitivität als auch die Antisymmetrie), ist es nicht schwer zu zeigen, dass das Finden eines Maximums in linearer Zeit nicht möglich ist. Es bezeichne # a i die Anzahl der Male eine i in einer Abfrage teilgenommen hat , wir eine kontradiktorische Beziehung in einer Art und Weise festlegen , dass das Maximum kann nicht ohne genügend Anfragen enthüllt werden. Angesichts der Abfrage ein i > ? a j , antworte a i > a j wenn # a i< < # aich einich einich> ? einj einich> aj undansonsten a i < a j . Wenn die Anzahl der Abfragen 0 ( n 2 ) ist , wurde noch kein Maximum festgestellt, und es kann eines der Elemente in der Menge festgelegt werden.# aich< n - 1 einich< aj o(n2)
quelle
n
Vergleichen muss Ihr aktuellesmax
könnte nur das Maximum eines Subarrays sein. Trotzdem kann man auch ohne Annahme 2 ein vorläufiges Maximum finden und es dann auf dem gesamten Array mit einem zweiten Scan innerhalb der O (n) -Grenze überprüfen.Wie Ariel bemerkt , ist der Standard-Maximum-Finding-Algorithmus wie folgt:
wird in der Tat ohne Änderung funktionieren, solange:
(Die obige erste Annahme kann tatsächlich gelockert werden, auch ohne dass der Algorithmus geändert werden muss, solange angenommen wird, dass das maximale Element mit jedem anderen Element vergleichbar ist und das
x > y
immer falsch ist, wenn die Elementex
undy
unvergleichbar sind.)Insbesondere Ihre Behauptung, dass:
trifft unter den oben angegebenen Annahmen nicht zu. Um zu beweisen, dass der obige Algorithmus immer das maximale Element findet, genügt es zu beachten, dass:
x
das maximale Element sein;m
das maximale Element ist; undm
ändert sich dies bei den nachfolgenden Iterationen nicht.Daher ist am Ende der Schleife
m
immer das maximale Element, wenn die Eingabe eins enthält.Ps. Wenn die Eingabe nicht unbedingt immer ein maximales Element enthält, muss die Antwort des Kandidaten für jedes andere Element getestet werden, um zu überprüfen, ob sie wirklich maximal ist. Wir können dies jedoch immer noch in O ( n ) Zeit tun, nachdem der oben beschriebene Maximum-Finding-Algorithmus ausgeführt wurde:
(Ich gehe hier davon aus, dass die Relation
>
irreflexiv ist, dh kein Element kann größer sein als sich selbst. Wenn dies nicht unbedingt der Fall ist, sollte der Vergleichx > m
in Schritt 2 durch ersetzt werdenx ≠ m and x > m
, wobei≠
Identitätsvergleich bedeutet. Oder wir könnten einfach die Optimierung anwenden Unten angegeben.)Um die Richtigkeit dieser Variation des Algorithmus zu beweisen, betrachten Sie die beiden möglichen Fälle:
m
. Es spielt keine Rolle, um welches Element es sich handelt, da es in jedem Fall nicht maximal sein wird, und daher erkennt Schritt 2 dies und kehrt zurückNone
.Wenn wir den Index von
m
in dem Eingabearray speicherna
, könnten wir Schritt 2 tatsächlich optimieren, um nur die Elemente zu überprüfen, die zuvorm
eingegangen sinda
, da alle späteren Elemente bereits mitm
Schritt 1 verglichen wurden. Diese Optimierung ändert jedoch nicht die Komplexität der asymptotischen Zeit des Algorithmus, der immer noch O ( n ) ist.quelle
if x > m:
ist sie undefiniert.Wenn Sie Ihre Liste mit Vergleichselementen durchgehen, kann jedes Element, das einen Vergleich "verliert", sofort verworfen werden, da es, um das größte zu sein, größer als ALLE anderen Elemente sein muss, damit es durch den einzelnen Verlust disqualifiziert wird.
Diese Lösung wird durch eine Feinheit ermöglicht: "Kein Element kann gleich sein", kombiniert mit der Tatsache, dass es immer ein größtes Element geben wird. Wenn wir Gewinnbeziehungen als gerichteten Graphen abbilden, ist es klar, dass wir das größte Element erreichen können, indem wir einfach den Gewinnen folgen.
quelle
Ich gehe davon aus, dass die Beziehung für mindestens ein einzelnes Element antisymmetrisch ist (was die Existenz des größten Elements garantiert), ansonsten ist die Aufgabe unmöglich. Wenn alle Elemente in der endlichen Menge vergleichbar sind, funktioniert die übliche Findungsmaximalprozedur.
Wenn einige Elemente nicht vergleichbar sind, funktioniert das folgende Verfahren
quelle
else if
benötigt wird. Es kann nicht ausgelöst werden, wennmax
es sich um das Maximum handelt, und wenn das Maximum noch nicht angetroffen wurde, spielt es keine Rolle, wie hoch der Wertmax
ist.if
s ohneelse
s lassen? Es ist nur eine Gewohnheit: Mitelse
s vergleichen wir nicht einmal. :)max
ein Element der Liste zu initialisieren und innerhalb der Schleife zu tunif max and a[i] are comparable and max < a[i] then max = a[i]
(wobei der erste Teil der Bedingung weggelassen werden könnte, wenn angenommen wird, dass der Versuch, zwei unvergleichbare Elemente zu vergleichen, immer falsch ist)?Ich hoffe das ist etwas verständlich. Fühlen Sie sich frei, in Kommentaren zu fragen oder zu bearbeiten.
Die Grundidee ist, dass Sie keine Informationen über die verbleibenden Elemente von denjenigen sammeln können, die Sie bereits kennen, wenn Sie eine völlig willkürliche Beziehung zulassen.
quelle
A > B
quelle