Hvordan bruke en skjevhet Heap i Java

En skew heap er en abstrakt datastruktur. Selv om Java ikke har omsorg for et binært tre klasse, kan skew haug sees på som en selvorganiser binært søketre. Java Skew Heap klassen implementerer interfacet Comparable så lister over SkewHeap objektene kan sorteres enkelt.

Bruksanvisning

1 Skriv skjelettet av SkewHeap klassen. Variablene av interesse er verdi (noden verdi) og venstre og høyre (venstre og høyre barn). TMP og rykke statiske variabler brukes til midlertidig plass i flette og skrive ut metoder. Konstruktøren initialiserer verdi og etterlater venstre og høyre som null. ""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 Bruk compareTo Fremgangsmåte som en måte for å oppfylle Sammenlignings grensesnitt og tillate lister av SkewHeap gjenstander som skal sorteres. CompareTo-metoden skal returnere et negativt tall, null eller positivt tall, avhengig av hvordan de to objektene skal sorteres. Oppnå dette ved å utføre en subtraksjon på de to noder enes verdier slik at noder med mindre verdier er sortert før noder av større verdi. ""public int compareTo(SkewHeap h) {
return value--h.value;
}""
""public int compareTo(SkewHeap h) {
return value--h.value;
}""

3 Komponer hogge metoden, en viktig metode som brukes av flettingen. Når en fletting er utført, er begge masser hakket hverandre løs på høyresiden. Hogge metoden utfører som kotelett og legger de resterende subheaps til tmp listen. ""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 Lag flettingen metoden. Innsatsen og removeHead metoder både bruk merge for å utføre sin oppgave. Flettingen metoden vil hogge begge masser å bli slått sammen, som lagrer alle subheaps i tmp.

5 Oppnå sortering av tmp lenket liste, og å kombinere de subheaps ved å fjerne de siste to masser fra listen. Legg en som høyre barn av den andre, bytte høyre og venstre barn og legge til heap tilbake til slutten av listen. På denne måte blir hakket subheaps sammen igjen i en enkelt balansert haug. Venstre noder er alltid garantert å være mindre enn de riktige noder, og barnet noder har en større verdi enn foreldrenodene. ""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 Skriv removeHead metoden. Dette vil fjerne hodet node og flette venstre og høyre barn masser. ""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 Formulere trykkemetoden. Denne metoden er viktig for debugging, som debuggere ikke ofte har fasiliteter til å vise nestede datastrukturer som dette skew haug. Det er rekursive og innrykk riktig. ""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--;
}""

Hint

  • Innsatsen metoden er en liten wrapper rundt flette å lage en enkelt node og slå det sammen med haugen.