-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFourWayHeap.java
More file actions
134 lines (115 loc) · 2.5 KB
/
FourWayHeap.java
File metadata and controls
134 lines (115 loc) · 2.5 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
public class FourWayHeap implements Minheap {
int shift,sizecount;
TreeNode[] heap;
public FourWayHeap() {
shift=3;
heap=new TreeNode[1000004];
sizecount=shift;
}
@Override
public void buildHeap(int[] freqArray) {
if(freqArray==null) return;
//fill the heap of TreeNode array
for(int i=0;i<freqArray.length;i++){
if(freqArray[i]>0){
heap[sizecount++]=new TreeNode(i,freqArray[i]);
}
}
// if there is atleast one element inserted in the heap array, then take care of the sizecount, which we increment
if(sizecount>shift)
sizecount--;
// min heapify from the child
for(int i=parent_Of_I(sizecount);i>=shift;i--){
minHeapify(i);
}
}
@Override
public void minHeapify(int index) {
int minChild=getMinChild(index);
if(minChild==index) return;
else{
TreeNode temp=heap[index];
heap[index]=heap[minChild];
heap[minChild]=temp;
minHeapify(minChild);
}
}
@Override
public TreeNode extractMin() {
if(sizecount<shift) return null;
TreeNode temp=heap[shift];
heap[shift]=heap[sizecount];
heap[sizecount]=null;
sizecount--;
minHeapify(shift);
return temp;
}
@Override
public void decreaseKey(int index, int newFreq) {
if(heap[index].freq<newFreq) return;
int parentofi=parent_Of_I(index);
heap[index].freq=newFreq;
TreeNode temp;
while(parentofi >= shift && heap[parentofi].freq>heap[index].freq){
temp=heap[parentofi];
heap[parentofi]=heap[index];
heap[index]=temp;
index=parentofi;
parentofi=parent_Of_I(index);
}
}
@Override
public TreeNode getMin() {
if(sizecount>=shift){
return heap[shift];
}
return null;
}
@Override
public int parent_Of_I(int i) {
if(i>shift)
return ((i-shift-1)/4)+shift;
return -1;
}
@Override
public int child_I_Of_J(int i, int j) {
return ((j-shift)*4)+i+shift;
}
@Override
public int getMinChild(int index) {
int smallest=index;
for(int i=1;i<=4;i++){
if(child_I_Of_J(i,index)<=sizecount){
if(heap[child_I_Of_J(i,index)].freq<heap[smallest].freq){
smallest=child_I_Of_J(i, index);
}
}
}
return smallest;
}
@Override
public TreeNode[] getHeapRef() {
return heap;
}
@Override
public int getShift() {
return shift;
}
@Override
public void setRoot(TreeNode minNode) {
heap[shift]=minNode;
minHeapify(shift);
}
@Override
public int getSizeCount() {
// TODO Auto-generated method stub
return sizecount;
}
@Override
public TreeNode getRoot() {
if(sizecount>=shift){
return heap[shift];
}
return null;
}
}