@@ -35,7 +35,7 @@ public MaxHeap() {
35
35
}
36
36
37
37
public int size () {
38
- return this . heap .size ();
38
+ return heap .size ();
39
39
}
40
40
41
41
/**
@@ -70,7 +70,10 @@ public T poll() {
70
70
* @param item item to be inserted
71
71
*/
72
72
public void offer (T item ) {
73
- assert !indexOf .containsKey (item ) : "Duplicate objects found!" ;
73
+ // shouldn't happen as mentioned in README; do nothing, though should customize behaviour in practice
74
+ if (indexOf .containsKey (item )) {
75
+
76
+ }
74
77
75
78
heap .add (item ); // add to the end of the arraylist
76
79
indexOf .put (item , size () - 1 ); // add item into index map; here becomes problematic if there are duplicates
@@ -83,11 +86,10 @@ public void offer(T item) {
83
86
* @param obj object to be removed
84
87
*/
85
88
public void remove (T obj ) {
86
- if (!indexOf .containsKey (obj )) {
87
- System .out .printf ("%s does not exist!%n" , obj );
88
- return ;
89
+ if (!indexOf .containsKey (obj )) { // do nothing
90
+
89
91
}
90
- this . remove (indexOf .get (obj ));
92
+ remove (indexOf .get (obj ));
91
93
}
92
94
93
95
/**
@@ -97,9 +99,9 @@ public void remove(T obj) {
97
99
* @return deleted element
98
100
*/
99
101
private T remove (int i ) {
100
- T item = this . get (i ); // remember element to be removed
101
- swap (i , this . size () - 1 ); // O(1) swap with last element in the heap
102
- heap .remove (this . size () - 1 ); // O(1)
102
+ T item = get (i ); // remember element to be removed
103
+ swap (i , size () - 1 ); // O(1) swap with last element in the heap
104
+ heap .remove (size () - 1 ); // O(1)
103
105
indexOf .remove (item ); // remove from index map
104
106
bubbleDown (i ); // O(log n)
105
107
return item ;
@@ -112,7 +114,10 @@ private T remove(int i) {
112
114
* @param updatedObj updated object
113
115
*/
114
116
public void decreaseKey (T obj , T updatedObj ) {
115
- assert updatedObj .compareTo (obj ) <= 0 : "Value should reduce or remain the same" ;
117
+ // shouldn't happen; do nothing, though should customize behaviour in practice
118
+ if (updatedObj .compareTo (obj ) > 0 ) {
119
+
120
+ }
116
121
117
122
int idx = indexOf .get (obj ); // get the index of the object in the array implementation
118
123
heap .set (idx , updatedObj ); // simply replace
@@ -128,7 +133,10 @@ public void decreaseKey(T obj, T updatedObj) {
128
133
* @param updatedObj updated object
129
134
*/
130
135
public void increaseKey (T obj , T updatedObj ) {
131
- assert updatedObj .compareTo (obj ) >= 0 : "Value should reduce or remain the same" ;
136
+ // shouldn't happen; do nothing, though should customize behaviour in practice
137
+ if (updatedObj .compareTo (obj ) < 0 ) {
138
+ return ;
139
+ }
132
140
133
141
int idx = indexOf .get (obj ); // get the index of the object in the array implementation
134
142
heap .set (idx , updatedObj ); // simply replace
@@ -144,10 +152,10 @@ public void increaseKey(T obj, T updatedObj) {
144
152
*/
145
153
public void heapify (List <T > lst ) {
146
154
heap = new ArrayList <>(lst );
147
- for (int i = 0 ; i < this . size (); i ++) {
148
- indexOf .put (this . get (i ), i );
155
+ for (int i = 0 ; i < size (); i ++) {
156
+ indexOf .put (get (i ), i );
149
157
}
150
- for (int i = this . size () - 1 ; i >= 0 ; i --) {
158
+ for (int i = size () - 1 ; i >= 0 ; i --) {
151
159
bubbleDown (i );
152
160
}
153
161
}
@@ -165,7 +173,7 @@ public void heapify(T... seq) {
165
173
indexOf .put (obj , j );
166
174
j ++;
167
175
}
168
- for (int i = this . size () - 1 ; i >= 0 ; i --) {
176
+ for (int i = size () - 1 ; i >= 0 ; i --) {
169
177
bubbleDown (i );
170
178
}
171
179
}
@@ -176,7 +184,7 @@ public void heapify(T... seq) {
176
184
@ Override
177
185
public String toString () {
178
186
StringBuilder ret = new StringBuilder ("[" );
179
- for (int i = 0 ; i < this . size (); i ++) {
187
+ for (int i = 0 ; i < size (); i ++) {
180
188
ret .append (heap .get (i ));
181
189
ret .append (", " );
182
190
}
@@ -199,11 +207,11 @@ private T get(int i) {
199
207
*/
200
208
private void swap (int idx1 , int idx2 ) {
201
209
// update the index of each value in the map
202
- indexOf .put (this . get (idx1 ), idx2 );
203
- indexOf .put (this . get (idx2 ), idx1 );
210
+ indexOf .put (get (idx1 ), idx2 );
211
+ indexOf .put (get (idx2 ), idx1 );
204
212
205
213
T tmp = get (idx1 ); // Recall internally implemented with an ArrayList
206
- heap .set (idx1 , this . get (idx2 ));
214
+ heap .set (idx1 , get (idx2 ));
207
215
heap .set (idx2 , tmp );
208
216
}
209
217
@@ -220,7 +228,7 @@ private int getParentIndex(int i) {
220
228
* @return parent of element at index i
221
229
*/
222
230
private T getParent (int i ) {
223
- return this . get (getParentIndex (i ));
231
+ return get (getParentIndex (i ));
224
232
}
225
233
226
234
/**
@@ -236,7 +244,7 @@ private int getLeftIndex(int i) {
236
244
* @return left child of element at index i
237
245
*/
238
246
private T getLeft (int i ) {
239
- return this . get (getLeftIndex (i ));
247
+ return get (getLeftIndex (i ));
240
248
}
241
249
242
250
/**
@@ -252,7 +260,7 @@ private int getRightIndex(int i) {
252
260
* @return right child of element at index i
253
261
*/
254
262
private T getRight (int i ) {
255
- return this . get (getRightIndex (i ));
263
+ return get (getRightIndex (i ));
256
264
}
257
265
258
266
/**
@@ -262,9 +270,9 @@ private T getRight(int i) {
262
270
* @param i given index
263
271
*/
264
272
private void bubbleUp (int i ) {
265
- while (i > 0 && this . get (i ).compareTo (getParent (i )) > 0 ) { // the furthest up you can go is the root
273
+ while (i > 0 && get (i ).compareTo (getParent (i )) > 0 ) { // the furthest up you can go is the root
266
274
int parentIdx = getParentIndex (i );
267
- this . swap (i , parentIdx );
275
+ swap (i , parentIdx );
268
276
i = parentIdx ;
269
277
}
270
278
}
@@ -277,7 +285,7 @@ private void bubbleUp(int i) {
277
285
*/
278
286
private boolean isLeaf (int i ) {
279
287
// actually, suffice to compare index of left child of a node and size of heap
280
- return this . getRightIndex (i ) >= this . size () && this . getLeftIndex (i ) >= this . size ();
288
+ return getRightIndex (i ) >= size () && getLeftIndex (i ) >= size ();
281
289
}
282
290
283
291
/**
@@ -287,17 +295,17 @@ private boolean isLeaf(int i) {
287
295
* @param i given index
288
296
*/
289
297
private void bubbleDown (int i ) {
290
- while (!this . isLeaf (i )) {
291
- T maxItem = this . get (i );
298
+ while (!isLeaf (i )) {
299
+ T maxItem = get (i );
292
300
int maxIndex = i ; // index of max item
293
301
294
302
// check if left child is greater in priority, if left exists
295
- if (getLeftIndex (i ) < this . size () && maxItem .compareTo (getLeft (i )) < 0 ) {
303
+ if (getLeftIndex (i ) < size () && maxItem .compareTo (getLeft (i )) < 0 ) {
296
304
maxItem = getLeft (i );
297
305
maxIndex = getLeftIndex (i );
298
306
}
299
307
// check if right child is greater in priority, if right exists
300
- if (getRightIndex (i ) < this . size () && maxItem .compareTo (getRight (i )) < 0 ) {
308
+ if (getRightIndex (i ) < size () && maxItem .compareTo (getRight (i )) < 0 ) {
301
309
maxIndex = getRightIndex (i );
302
310
}
303
311
0 commit comments