Der naive Algorithmus zur Bestimmung von aus :A.BA
Bestimmen Sie für den Wert von indem Sie jedes mit für
und diejenigen zählen, die erfüllen .B ( k ) A ( i ) A ( k ) i = 1 , ... , k A ( ik=1,…,nB(k)A(i)A(k)i=1,…,kA(i)<A(k)
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−1A(2)n−2(n−1)(n−2)2B(n)B(n)=A(n)−1 nn−1B(n−1)A(1)A(n−2)A(n)
Verwenden Sie für den obigen Algorithmus. Verwenden Sie für
den umgekehrten Algorithmus: Bestimmen Sie indem Sie ihn zunächst auf und dann für jeden Eintrag für subtrahieren , das ist kleiner als .k=1,…,n2k=n2,…,nB(k)A(n)−11A(i)i=k+1,…,nA(k)
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)4O(n2)ABB(n)=A(n)−1A(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:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
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)