2017-09-19 12 views
0

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?

+0

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. –

+0

In Ihrer 'add' Methode sollte nicht' last.next = Node; 'be' first.next = Node; '? – OldCurmudgeon

Antwort

0

Sie Blase verwenden Sorte, die besitzt Komplexität O (n^2)

der Algorithmus zur verketteten Liste, die mit der Komplexität der O (n log n) anwendbar ist ist Merge Sort.

Bitte sehen this walk trough of merge sort for linked lists

+0

Ich habe versucht, eine kleine Änderung an den Code in der Verbindung hinzuzufügen: 'if (a.item <= b.item) { Ergebnis = a; result.next = sortierteMerge (a.next, b); } sonst if (a.item> b.item) { Ergebnis = b; invCount ++; result.next = sortedMerge (a, b.next); } ' Ich hatte gehofft, dass invCount um 1 erhöht werden würde, wenn a.item TheSaviour

+0

schwer zu sehen, ohne die vollständige Implementierung, aber per Code in aboce Kommentar 'invCount ++' würde nicht ausgeführt werden, wenn 'a.item b.item' – diginoise

+0

Das ist die Idee. Wenn der Wert in der linken Teilverknüpfungsliste größer als der Wert in der rechten Teilverknüpfungsliste ist, sollte invCount um 1 erhöht werden. Aber wenn ich es getestet habe, berechnet es nicht die korrekte Anzahl von Inversionen – TheSaviour

Verwandte Themen