ich eine sehr einfache verknüpfte Liste in Java erstellt haben:Zählen Inversionen in einer verketteten Liste mit O (n log n) Laufzeit
public class LinkedList {
class Node {
public Node next;
public int item;
public Node (int item) {
this.item = item;
}
}
int listSize = 0;
Node first = null;
Node last = null;
public void add(int n) {
Node node = new Node(n);
if (first == null) {
first = node;
} else {
last.next = node;
}
last = node;
listSize++;
}
}
So in der Hauptklasse, werde ich Hinzufügen von Elementen werden zu der verknüpften Liste in zufälliger Reihenfolge. Aber wie kann ich eine Methode erstellen, die die Anzahl der Inversionen in der Linked-List zählt?
Bisher habe ich es geschafft, es zu erreichen mit O (N^2) Laufzeit:
public int inversionCount() {
int count = 0;
Node current = this.first;
for (int i = 0; i <= this.listSize - 2; i++) {
Node next = current.next;
for (int j = i + 1; j < this.listSize; j++) {
if (current.item > next.item) {
System.out.print("(" + current.item + "," + next.item + ")" + " ");
count += 1;
}
next = next.next;
}
current = current.next;
}
return count;
}
jedoch, wie gesagt, die Laufzeit für diesen Algorithmus ist O (N^2) . Ich versuche eine Laufzeit von O (NlogN) zu erreichen. Wie kann dies erreicht werden?
Wenn Sie die Liste als Liste (Wert, Original-Index) sortiert haben - O (N log N). Dann können der Index und der ursprüngliche Index eine mathematische Beziehung zu der Inversionszahl haben. Oder so. Fröhlich rätselnd. In der Tat könnte der Sortieralgorithmus selbst die Inversionen in einer parallelen Array-Inversion zählen. –
In Ihrer 'add' Methode sollte nicht' last.next = Node; 'be' first.next = Node; '? – OldCurmudgeon