-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCacOptHeap.java
More file actions
96 lines (76 loc) · 2.49 KB
/
CacOptHeap.java
File metadata and controls
96 lines (76 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.util.HashMap;
import java.util.Map;
public class CacOptHeap {
public static int cntr = 0;
public BinHeapNode buildHuffmanTree(HashMap<String, Integer> huff) {
BinHeapNode left;
BinHeapNode right;
BinHeapNode top;
cntr = huff.size();
BinHeapNode[] minHeap = createAndBuildMinHeap(huff);
while (cntr != 1)
{
left = extractMin(minHeap);
right = extractMin(minHeap);
top = new BinHeapNode("$", left.frequency + right.frequency);
top.left = left;
top.right = right;
cntr++;
minHeap[cntr - 1] = top;
}
return extractMin(minHeap);
}
public static BinHeapNode[] createAndBuildMinHeap(HashMap<String, Integer> huff)
{
BinHeapNode[] minHeap = new BinHeapNode[huff.size()];
int i = 0;
for (Map.Entry<String, Integer> entry : huff.entrySet()){
minHeap[i] = new BinHeapNode(entry.getKey(),entry.getValue());
i++;
}
buildMinHeap(minHeap);
return minHeap;
}
public static void buildMinHeap(BinHeapNode[] minHeap)
{
int n = minHeap.length - 1;
int i;
for (i = (n - 1) / 4; i >= 0; --i)
minHeapify(minHeap, i, cntr);
}
public static void minHeapify(BinHeapNode[] minHeap, int idx, int cntr)
{
int smallest = idx;
int left1 = 4 * idx + 1;
int left2 = 4 * idx + 2;
int right1 = 4 * idx + 3;
int right2 = 4 * idx + 4;
if (left1 < cntr && minHeap[left1].frequency < minHeap[smallest].frequency)
smallest = left1;
if (left2 < cntr && minHeap[left2].frequency < minHeap[smallest].frequency)
smallest = left2;
if (right1 < cntr && minHeap[right1].frequency < minHeap[smallest].frequency)
smallest = right1;
if (right2 < cntr && minHeap[right2].frequency < minHeap[smallest].frequency)
smallest = right2;
if (smallest != idx)
{
swapMinHeapNode(minHeap,smallest,idx);
minHeapify(minHeap, smallest, cntr);
}
}
public static void swapMinHeapNode(BinHeapNode[] minHeap, int smallest, int idx)
{
BinHeapNode temp = minHeap[smallest];
minHeap[smallest] = minHeap[idx];
minHeap[idx] = temp;
}
public static BinHeapNode extractMin(BinHeapNode[] minHeap)
{
BinHeapNode tmp = minHeap[0];
minHeap[0] = minHeap[cntr - 1];
cntr--;
minHeapify(minHeap, 0, cntr);
return tmp;
}
}