Ich bin bei diesem Problem festgefahren:
Wenn ein Array der ersten zufällig permutierten natürlichen Zahlen gegeben ist, wird ein Array so konstruiert, dass die Anzahl der Elemente von bis die kleiner als . B B ( k ) A ( 1 ) A ( k - 1 ) A ( k )
i) Kannst du bei gegebenem in Zeit finden? ii) Kannst du bei gegebenem in Zeit finden?B O ( n ) B A O ( n )
Hier ist . Ein konkretes Beispiel: | A 8 4 3 1 7 2 9 6 5 B 0 0 0 0 3 1 6 4 4 |
Kann mir jemand helfen? Vielen Dank.
algorithms
arrays
permutations
verdammt
quelle
quelle
Antworten:
Der naive Algorithmus zur Bestimmung von aus :A.B A
Dieser Algorithmus vergleicht mit allen anderen ( mal), mit anderen usw., sodass die Gesamtzahl der Vergleiche beträgt. . Aber das ist nicht das Beste, was wir tun können. Wenn wir zum Beispiel , müssen wir keine Vergleiche anstellen! da es sich um die ersten natürlichen Zahlen handelt und garantiert ist (unabhängig von der Permutation), dass die niedrigeren natürlichen Zahlen vorhanden sind. Was ist mit ? Anstatt bis prüfen, könnten wir auch prüfen . Das ist:A(1) n−1 A(2) n−2 (n−1)(n−2)2 B(n) B(n)=A(n)−1 n n−1 B(n−1) A(1) A(n−2) A(n)
Dies würde Schritte, was immer noch . Beachten Sie auch, dass bei der Konstruktion von aus , wenn ist, .2×(n2−1)(n2−2)2=(n−2)(n−4)4 O(n2) A B B(n)=A(n)−1 A(n)=B(n)+1
Aber jetzt zu mehr Finesse. Wenn wir zusätzlichen Platz oder eine Sortierung an Ort und Stelle haben, können wir die Zahlen sortieren, während wir sie vergleichen. Zum Beispiel:
Anstatt alle zu überprüfen (oder sie in der richtigen Reihenfolge zu überprüfen), könnten wir die binäre Suche verwenden, um jedes zu bestimmen . Die Sortierung benötigt jedoch noch Zeit .B(k) O(nlogn)
quelle
Anstatt jedes einzeln zu bestimmen , können wir vorausschauend sein und jede Zahl in einmal durchgehen ! Aber wir werden Leerzeichen verwenden:B(k) A n
Wir könnten noch mehr Zeit sparen, indem wir die bereits ermittelten nicht aktualisieren (dh es macht keinen Sinn, nach dem ersten Schritt zu aktualisieren), aber im schlimmsten Fall müssen wir mal8 (n)(n+2)2
quelle
Sowohl I als auch II sind mit #next_greater_element lösbar, das ich hier erklärt habe . Aber es ist etwas schwieriger als nur das Problem, aber vor der Lösung müssen Sie das nächst größere Element lernen:
Der zweite Teil ist ähnlich und stellt fest, dass wir den Wert des am besten geeigneten Elements in EDIT erhalten können: Meine Lösung ist falsch, es scheint, dass es keine -Lösung gibto ( n )O(1) o(n)
quelle