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?
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. –
Dans votre méthode 'add', ne devrait pas' last.next = Node; 'soit' first.next = Node; '? – OldCurmudgeon