Aufbau einer min-heap mit java
Habe ich versucht zu bauen, ein minHeap, die mit java, das ist mein code:
public class MyMinHeap {
private ArrayList<Node> heap;
public MyMinHeap() {
heap = new ArrayList<Node>();
}
public MyMinHeap(ArrayList<Node> nodeList) {
heap = nodeList;
buildHeap();
}
public void buildHeap() {
int i = heap.size() / 2;
while (i >= 0) {
minHeapify(i);
i--;
}
}
public Node extractMin() {
if (heap.size() <= 0) return null;
Node minValue = heap.get(0);
heap.set(0, heap.get(heap.size() - 1));
heap.remove(heap.size() - 1);
minHeapify(0);
return minValue;
}
public String toString() {
String s = "";
for (Node n : heap) {
s += n + ",";
}
return s;
}
public void minHeapify(int i) {
int left = 2 * i + 1;
int right = 2 * i + 2;
int smallest = i;
if (left < heap.size() - 1 && lessThan(left, smallest))
smallest = left;
if (right < heap.size() - 1 && lessThan(right, smallest))
smallest = right;
if (smallest != i) {
swap(smallest, i);
minHeapify(smallest);
}
}
private void swap(int i, int j) {
Node t = heap.get(i);
heap.set(i, heap.get(j));
heap.set(j, t);
}
public boolean lessThan(int i, int j) {
return heap.get(i)
.compareTo(heap.get(j)) < 0;
}
public static void main(String[] args) {
char[] chars = {'a', 'b', 'c', 'd', 'e', 'f'};
int[] freqs = {45, 13, 12, 16, 9, 5};
ArrayList<Node> data = new ArrayList<Node>();
for (int i = 0; i < chars.length; i++) {
data.add(new Node(chars[i], freqs[i]));
}
MyMinHeap heap = new MyMinHeap(data);
System.out.println("print the heap : " + heap);
for (int i = 0; i < chars.length; i++) {
System.out.println("Smallest is :" + heap.extractMin());
}
}
}
Die Ausgabe sollte sein:5,9,12,13,16,45,
aber was ich bekam ist : 9,13,12,16,45
Ich habe gedebuggt dies aber noch nicht herausfinden können, jemand helfen? vielen Dank.
- Was ist Ihre
Node
Klasse? Haben Sie versucht, schrittweise, mit einem debugger zu sehen, was ist falsch? - Erstellen Sie eine mcve
- Ich wusste nicht, sollte ich akzeptieren, beantworten, bevor Sie, sorry Alex.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist in Ihrem
minHeapify
Funktion. Sie haben:Nun, lasst uns sagen, dass Ihre erste array-Liste ist
{3,2}
, und Sie rufenminHeapify(0)
.Ihre nächste Anweisung:
Zu diesem Zeitpunkt
left = 1
, undheap.size()
gibt 2 zurück. Soleft
ist nicht kleiner alsheap.size() - 1
. Damit Sie Ihre Funktion beendet, ohne dass ein vertauschen der beiden Elemente.Entfernen Sie die
- 1
aus Ihre Bedingungen, das geben:Einfügen :
Beim einfügen in einen min-heap, beginnen wir, indem Sie das element an der Unterseite. Wir legen an der
der niedrigstwertigen Stelle, damit der komplette Baum-Eigenschaft.
Dann werden wir ein "Update" der Baum durch vertauschen das neue element mit seinen Eltern, bis wir eine geeignete Stelle für
das element. Wir im wesentlichen Blase bis das minimale element.
Dies dauert 0 (log n) Zeit, wobei n die Anzahl der Knoten im heap.
Extrakt Minimale Element :
Finden des minimalen Elements in einem min-heap ist einfach: es ist immer an der Spitze. Der schwierigste Teil ist, wie zu entfernen
es. (I n der Tat, dies ist nicht so schwierig.)
Zuerst entfernen wir das minimale element und tausche es mit dem letzten element im heap (die untersten,
am weitesten rechts stehenden element). Dann, wir bubble down element, tauschen es mit einem seiner Kinder, bis die minheap
- Eigenschaft wiederhergestellt ist.
Wir vertauschen es mit dem linken Kind oder das Rechte Kind? Das hängt davon ab, Ihre Werte. Es gibt keine inhärente
die Bestellung zwischen dem linken und rechten element, aber Sie müssen nehmen Sie die kleinere in Ordnung zu halten
die min-heap-Bestellung.