La construction d'un min tas à l'aide de java
J'ai essayé de construire un minHeap à l'aide de java, c'est mon 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());
}
}
}
La sortie doit être:5,9,12,13,16,45,
mais ce que j'ai est : 9,13,12,16,45
J'ai débogué ce mais ne peut toujours pas comprendre, quelqu'un de l'aide? merci beaucoup.
- Qu'est-ce que votre
Node
classe? Avez-vous essayé les passant en revue avec un débogueur pour voir quel est le problème? - Créer un mcve
- Je ne savais pas que je devrais accepter de répondre avant, désolé Alex.
Vous devez vous connecter pour publier un commentaire.
Le problème est dans votre
minHeapify
fonction. Vous avez:Maintenant, disons que votre tableau liste est
{3,2}
, et que vous appelezminHeapify(0)
.Votre prochaine déclaration:
À ce point,
left = 1
, etheap.size()
renvoie 2. Doncleft
n'est pas plus petit queheap.size() - 1
. Si votre fonction ne se termine sans permutation de deux éléments.Supprimer la
- 1
de votre conditionnelles, donnant:Insérer :
Lorsque nous insérer dans un min-tas, on commence toujours par l'insertion de l'élément en bas. Nous insérer à la
a droite à l'endroit de façon à maintenir la complète de l'arbre de la propriété.
Ensuite, nous "réparer" l'arbre par le remplacement de l'élément nouveau, avec ses parents, jusqu'à ce que nous trouver un endroit approprié pour
l'élément. Nous avons essentiellement bulle de l'élément minimum.
Cela prend 0 (log n) fois, où n est le nombre de nœuds dans le tas.
Extrait D'Élément Minimum :
Trouver l'élément minimum de un min-tas est simple: c'est toujours au top. La partie la plus difficile est de savoir comment l'enlever
c'. (Je n fait, ce n'est pas que difficile.)
D'abord, on supprime l'élément minimum et il échange avec le dernier élément dans le tas (le dernier,
plus à droite de l'élément). Ensuite, nous avons bulle en bas de cet élément, en l'échangeant avec un de ses enfants jusqu'à ce que le minheap
la propriété est restaurée.
Nous ne remplacez-la par la gauche de l'enfant ou le droit de l'enfant? Qui dépend de leurs valeurs. Il n'y a pas inhérente
commande entre la gauche et la droite de l'élément, mais vous aurez besoin de prendre le plus petit dans le but de maintenir
le min de segment de mémoire de la commande.