UNPKG

min-heap

Version:

min-heap data structure

112 lines (78 loc) 1.92 kB
function CMP(l,r) { return l-r; } function MinHeap(scoreFn) { this.cmp = scoreFn || CMP; this.heap = []; this.size = 0; } MinHeap.prototype = { clear: function() { this.heap.length = 0; this.size = 0; }, contains: function(item) { var heap = this.heap; for (var i = 0, sz = this.size; i < sz; ++i) { if (heap[i] === item) return true; } return false; }, insert: function(item) { var heap = this.heap, ix = this.size++; heap[ix] = item; var parent = (ix-1)>>1; while ((ix > 0) && this.cmp(heap[parent], item) > 0) { var tmp = heap[parent]; heap[parent] = heap[ix]; heap[ix] = tmp; ix = parent; parent = (ix-1)>>1; } }, removeHead: function() { var heap = this.heap, cmp = this.cmp; if (this.size === 0) return undefined; var out = heap[0]; this._bubble(0); return out; }, remove: function(item) { var heap = this.heap; for (var i = 0; i < this.size; ++i) { if (heap[i] === item) { this._bubble(i); return true; } } return false; }, _bubble: function(ix) { var heap = this.heap, cmp = this.cmp; heap[ix] = heap[--this.size]; heap[this.size] = null; while (true) { var leftIx = (ix<<1)+1, rightIx = (ix<<1)+2, minIx = ix; if (leftIx < this.size && cmp(heap[leftIx], heap[minIx]) < 0) { minIx = leftIx; } if (rightIx < this.size && cmp(heap[rightIx], heap[minIx]) < 0) { minIx = rightIx; } if (minIx !== ix) { var tmp = heap[ix]; heap[ix] = heap[minIx]; heap[minIx] = tmp; ix = minIx; } else { break; } } } }; module.exports = MinHeap;