Wie finde ich den Rang jedes Elements in einem Integer-Array?

9

Ich möchte den Rang jedes Elements in einem Array herausfinden, das bei 0 beginnt.

Beispiel:

%Vor%

Erläuterung:

%Vor%

Was ich ausprobiert habe, ist n^2 time complexity algorithm. Ich möchte einen Algorithmus mit linearer zeitlicher Komplexität O(n) .

Jemand hat mir im Kommentarbereich eine Lösung dafür gegeben, aber sein Kommentar wurde gelöscht. Ich weiß nicht wie. Das funktioniert korrekt für negative ganze Zahlen und positive ganze Zahlen sowie sehr große Liste.

Danke an den Autor

%Vor%     
Syed Shibli 10.08.2015, 11:37
quelle

7 Antworten

3

Also mit Rang meinen Sie die Position, wo dieses Element nach dem Sortieren des Arrays landen würde?

Sie können mit einer Identitätsabbildung map = {0,1,2} beginnen und diese dann sortieren, aber Ihren arr als Sortierschlüssel verwenden.

%Vor%

Auf diese Weise ändern Sie nicht Ihr ursprüngliches Array, sondern erhalten eine Zuordnung von Ihren Array-Elementen zu ihrem Rang.

Offensichtlich hängt dieser Algorithmus von der Komplexität Ihres Sortieralgorithmus ab. Sie sollten mit O (n log n) enden, aber vielleicht erlauben es Ihre Daten, Sortieralgorithmen mit O (n) -Komplexität zu verwenden. Aber das hängt wirklich davon ab, was Sie in Ihrer großen Liste speichern.

    
Tali 12.08.2015 09:08
quelle
1

sortiert zuerst alle Elemente und speichert sie in einem anderen Array (wenn die Elemente unsortiert sind) Drucken Sie dann den Element-Index aus diesem Array.

    
Osman Goni Nahid 10.08.2015 11:40
quelle
1

Verwenden Sie radix sort, um Ihr Array in linearer Zeit zu sortieren. Jedes Element hat seinen eigenen Rang.

    
uoyilmaz 10.08.2015 11:43
quelle
1

Ich gebe eine Idee. Wenn Sie möchten, können Sie dies verwenden:

%Vor%
  1. Erstellen Sie zunächst ein count_array aus dem Eingabearray nach counting sort technique (Beispiel: array = {2, 1, 3}, So count_array = {0,1,1,1} // hier array value verwenden als% Code%).
  2. Dann kannst du count_array index value wie count_array // du nur result_array = {0, 1, 2, 3} filtern (du kannst das auch in add 1 with previous added value if count_array[i] == 1 machen. Ich benutze count_array um nur zu verstehen)
  3. Dann machen Sie eine result _array von rank_array By result_array
  4. Endlich kannst du deine rank_array[i] = result_array[array[i]] - 1 mit rank_array finden

Beispiel:

%Vor%     
Sakib Ahammed 10.08.2015 12:07
quelle
1

in Java 8, erstes Array zum Auflisten, dann zum Streamen. wegen nur einer Schleife im Strom sollte es O (n) sein.

%Vor%

Ergebnis: {1,0,2}

    
Lgland Wang 14.08.2016 13:35
quelle
1

Sie können eine Map verwenden, um den Index im Array dem Wert zuzuordnen, nach den Werten zu sortieren und die Indizes zurückzugeben. Es könnte so aussehen:

%Vor%

Beispielverwendung:

%Vor%     
assylias 27.02.2017 11:42
quelle
1

Es ist möglich, diesen Rang unter Verwendung einer Datenstruktur zu berechnen, die "Ordnungsstatistikbaum" genannt wird, es ist eine erweiterte Datenstruktur. Um diese Struktur zu implementieren, müssen Sie einen ausgeglichenen Binärbaum (z. B. AVL-Baum oder Rot-Schwarz-Baum) implementieren, und Sie fügen jedem Knoten ein zusätzliches Attribut hinzu. Dies ist ein sehr effizienter Weg, um Ränge zu berechnen, da für jedes Element O (lg n) (wobei lg der Logarithmus der Basis 2 ist) benötigt wird. Weitere Informationen zu dieser Datenstruktur finden Sie in "Einführung in Algorithmen" in Kapitel 14.

Das Problem mit der Sortierung ist, dass die Laufzeit O (nlog (n)) ist und ich denke, dass es ineffizient ist, wenn Sie wenige Elemente rangieren möchten (d. h. weniger als n Elemente).

    
Lemark 22.08.2017 22:23
quelle