Tecnología

Inicio

Cómo utilizar una inclinación Montón en Java

Un montón de inclinación es una estructura de datos abstracta. Aunque Java no prevé una clase de árbol binario, el montón de inclinación puede ser pensado como un árbol binario de búsqueda de auto-organización. La clase Java inclinación Montón implementa la interfaz Comparable tan listas de objetos SkewHeap pueden ordenarse fácilmente.

Instrucciones

1 Escribe el esqueleto de la clase SkewHeap. Las variables de interés son el valor (el valor del nodo) y la izquierda y la derecha (la izquierda ya la derecha los niños). Las variables TMP y sangría estática se utilizan para el espacio temporal en los métodos de combinación e impresión. El constructor inicializa el valor y deja a izquierda y derecha como nulo. ""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 Utilice el método compareTo como una manera de cumplir con la interfaz Comparable y permitir listas de objetos SkewHeap sean ordenados. El método compareTo debe devolver un valor negativo, cero o número positivo, dependiendo de cómo deben ordenarse los dos objetos. Lograr esto realizando una sustracción en los valores de los dos nodos "de tal manera que los nodos con valores menores se clasifican antes de nodos de mayor valor. ""public int compareTo(SkewHeap h) {
return value--h.value;
}""
""public int compareTo(SkewHeap h) {
return value--h.value;
}""

3 Componer el método chuleta, un importante método utilizado por fusión. Cuando se realiza una fusión, los dos montones separados son picados por el lado derecho. El método de la tajada que realiza chuleta y añade los restantes subheaps a la 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 Crear el método de combinación. Los métodos de inserción y removeHead utilizar la combinación de ambos para llevar a cabo su tarea. El método de combinación de los dos montones tajará que se fusionen, que almacena todos los subheaps en tmp.

5 Lograr la clasificación de la lista vinculada tmp y la combinación de los subheaps quitando los dos últimos montones de la lista. Añadir uno como el hijo derecho de la otra, cambie la derecha y la izquierda niños y añadir el montón de nuevo al final de la lista. De esta manera, subheaps picados se vuelven a montar en un único montón equilibrada. Nodos que quedan siempre se garantiza que sea inferior a los nodos de la derecha, y los nodos secundarios tienen un valor superior a los nodos primarios. ""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 Escribe el método removeHead. Esto eliminará el nodo principal y fusionar los montones hijo izquierdo y derecho. ""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 Formular el método de impresión. Este método es importante para la depuración, como los depuradores no suelen tener las instalaciones para ver las estructuras de datos anidadas como este montón de inclinación. Es recursivo y guiones correctamente. ""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--;
}""

Consejos y advertencias

  • El método de inserción es una pequeña envoltura alrededor fusionan para crear un único nodo y fusionarlo con el montón.