2017-09-19 4 views
0

J'ai créé une liste chaînée très simple en Java:de comptage dans inversions une liste liée à O (n log n) en cours d'exécution

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++; 
    } 
} 

Ainsi, dans la classe principale, je vais ajouter des éléments à la liste liée dans un ordre aléatoire. Mais comment puis-je créer une méthode qui compte le nombre d'inversions dans la liste liée?

Jusqu'à présent, je suis parvenu à le réaliser avec O (N^2) durée:

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; 
    } 

Cependant, comme je l'ai dit, le temps d'exécution pour cet algorithme est O (N^2) . J'essaie d'atteindre un temps de fonctionnement de O (NlogN). Comment cela peut il etre accompli?

+0

Si vous avez la liste triée liste des (valeur, indice d'origine) - O (N log N). L'index et l'index d'origine peuvent alors avoir une relation mathématique avec le nombre d'inversion. Ou tel. Heureux énigmatique. Si l'algorithme de tri lui-même pouvait compter les inversions dans un tableau parallèle, l'inversion compte. –

+0

Dans votre méthode 'add', ne devrait pas' last.next = Node; 'soit' first.next = Node; '? – OldCurmudgeon

Répondre

0

Vous utilisez bulle genre qui a la complexité de O (n^2)

Pour liste chaînée l'algorithme qui est applicable à la complexité de O (n log n) est Fusion Trier.

S'il vous plaît voir this walk trough of merge sort for linked lists

+0

J'ai essayé d'ajouter une légère modification au code dans le lien: 'if (a.item <= b.item) { résultat = a; result.next = triedMerge (a.next, b); } sinon if (a.item> b.item) { résultat = b; invCount ++; result.next = triedMerge (a, b.next); } ' J'espérais que invCount serait incrémenté de 1 si a.item TheSaviour

+0

difficile à voir sans l'implémentation complète, mais par votre code dans le commentaire aboce 'invCount ++' ne serait pas exécuté quand 'a.item b.item' – diginoise

+0

idée. Si la valeur dans la liste sous-liée gauche est supérieure à la valeur dans la liste sous-liée droite, alors invCount devrait incrémenter de 1. Mais quand je l'ai testé, il ne calcule pas le nombre correct d'inversions – TheSaviour