Come utilizzare un Skew heap in Java

April 28

Un mucchio skew è una struttura dati astratta. Anche se Java non prevede una classe di albero binario, il cumulo skew può essere pensato come un albero binario di ricerca auto-organizzante. La classe Java Skew Heap implementa l'interfaccia Comparable così elenchi di oggetti SkewHeap possono essere ordinati facilmente.

istruzione

1 Scrivere lo scheletro della classe SkewHeap. Le variabili di interesse sono il valore (il valore del nodo) e destra e sinistra (sinistra e destra i bambini). Le variabili TMP e trattino statici sono utilizzati per spazio temporaneo in unione e stampare metodi. Il costruttore inizializza valore e lascia a destra ea sinistra come nullo. ""public class SkewHeap implements Comparable {
int value;
SkewHeap left, right;
static LinkedList tmp;
static int indent = 0; public SkewHeap(int val) {
value = val;
}
}""
""public class SkewHeap implements Comparable {
int value;
SkewHeap left, right;
static LinkedList tmp;
static int indent = 0; public SkewHeap(int val) {
value = val;
}
}""
""public class SkewHeap implements Comparable {
int value;
SkewHeap left, right;
static LinkedList tmp;
static int indent = 0; public SkewHeap(int val) {
value = val;
}
}""

2 Utilizzare il metodo compareTo come un modo per soddisfare l'interfaccia Comparable e permettono liste di oggetti SkewHeap da ordinare. Il metodo compareTo deve restituire un numero negativo, zero o numero positivo, a seconda di come i due oggetti devono essere ordinati. Raggiungere questo eseguendo una sottrazione sui valori dei due nodi 'in modo tale che i nodi con valori minori sono ordinati prima di nodi di maggior valore. ""public int compareTo(SkewHeap h) {
return value--h.value;
}""
""public int compareTo(SkewHeap h) {
return value--h.value;
}""

3 Comporre il metodo chop, un metodo importante utilizzato da fusione. Quando si esegue una stampa unione, entrambi cumuli vengono tagliati a pezzi lungo il lato destro. Il metodo di chop chop esegue che e aggiunge i restanti subheaps alla lista tmp. ""public void chop() {
SkewHeap r = right;
right = null;

if( r != null ) r.chop();
tmp.addLast(this);
}""
""public void chop() {
SkewHeap r = right;
right = null;

if( r != null ) r.chop();
tmp.addLast(this);
}""

4 Creare il metodo di fusione. I metodi di inserimento e removeHead entrambe uso si fondono per realizzare il loro compito. Il metodo di fusione sarà tagliare entrambi i cumuli da unire, che memorizza tutti i subheaps in tmp.

5 Realizzare l'ordinamento della lista collegata tmp e combinando i subheaps rimuovendo le ultime due cumuli dalla lista. Aggiungere uno come figlio destro dell'altro, scambiare la bambini destro e sinistro e aggiungere il mucchio di fine dell'elenco. In questo modo, subheaps tagliati vengono riassemblati in un unico mucchio equilibrato. Nodi di sinistra sono sempre garantite ad essere inferiore i nodi giusti, e nodi figli hanno un valore maggiore di nodi padre. ""public SkewHeap merge(SkewHeap h) {
// Chop the nodes down the right path
tmp = new LinkedList ();
chop();
h.chop();

// Sort the nodes
Collections.sort(tmp);

// Merge the subheaps
while(tmp.size() > 1) {
SkewHeap a = tmp.removeLast();
SkewHeap b = tmp.removeLast();

b.right = b.left;
b.left = a;

tmp.addLast(b);
}

return tmp.getFirst();
}""
""public SkewHeap merge(SkewHeap h) {
// Chop the nodes down the right path
tmp = new LinkedList ();
chop();
h.chop();

// Sort the nodes
Collections.sort(tmp);

// Merge the subheaps
while(tmp.size() > 1) {
SkewHeap a = tmp.removeLast();
SkewHeap b = tmp.removeLast();

b.right = b.left;
b.left = a;

tmp.addLast(b);
}

return tmp.getFirst();
}""
""public SkewHeap merge(SkewHeap h) {
// Chop the nodes down the right path
tmp = new LinkedList ();
chop();
h.chop();

// Sort the nodes
Collections.sort(tmp);

// Merge the subheaps
while(tmp.size() > 1) {
SkewHeap a = tmp.removeLast();
SkewHeap b = tmp.removeLast();

b.right = b.left;
b.left = a;

tmp.addLast(b);
}

return tmp.getFirst();
}""

6 Scrivi il metodo removeHead. Questo eliminerà il nodo principale e unire i cumuli bambino a destra ea sinistra. ""public SkewHeap removeHead() {
if( left == null && right == null ) return null;
else if( left == null ) return right;
else if( right == null ) return left;
else return left.merge(right);
}""
""public SkewHeap removeHead() {
if( left == null && right == null ) return null;
else if( left == null ) return right;
else if( right == null ) return left;
else return left.merge(right);
}""

7 Formulare il metodo di stampa. Questo metodo è importante per il debug, come i debugger spesso non hanno le strutture per visualizzare le strutture dati annidate come questo mucchio skew. E 'ricorsivo e trattino in modo corretto. ""public void print() {
for( int i = 0; i < indent; ++i ) System.out.print(" ");

System.out.println(value);
indent++;
if( left != null ) {
for( int i = 0; i < indent; ++i ) System.out.print(" ");
System.out.println("<-");
left.print();
}
if( right != null ) {
for( int i = 0; i < indent; ++i ) System.out.print(" ");
System.out.println("->");
right.print();
}
indent--;
}""
""public void print() {
for( int i = 0; i < indent; ++i ) System.out.print(" ");

System.out.println(value);
indent++;
if( left != null ) {
for( int i = 0; i < indent; ++i ) System.out.print(" ");
System.out.println("<-");
left.print();
}
if( right != null ) {
for( int i = 0; i < indent; ++i ) System.out.print(" ");
System.out.println("->");
right.print();
}
indent--;
}""

Consigli e avvertenze

  • Il metodo di inserimento è un piccolo involucro intorno si fondono per creare un singolo nodo e si fondono con il mucchio.