1 var define = require("../define").define, 2 Heap = require("./Heap"), 3 base = require("../base"); 4 5 var floor = Math.floor, MinHeap; 6 /** 7 * @class <p> Min Heap implementation, lowest value in heap is always at the root.</p> 8 * </br> 9 * <b>Performance</b> 10 * <table> 11 * <tr><td></td><td>Best</td><td>Worst</td></tr> 12 * <tr><td>Insert</td><td>O(log n)</td><td>O(log n)</td></tr> 13 * <tr><td>Remove</td><td>O(log n)</td><td>O(log n)</td></tr> 14 * <tr><td>Peek</td><td>O(1)</td><td>O(1)</td></tr> 15 * <tr><td>Contains</td><td>O(n)</td><td>O(n)</td></tr> 16 * <table> 17 * @name MinHeap 18 * @augments comb.collections.Heap 19 * @memberOf comb.collections 20 */ 21 module.exports = exports = define(Heap, { 22 instance : { 23 24 __upHeap : function(index) { 25 var heap = this.__heap; 26 var node = heap[index], key = node.key, gpi = this.__getParentIndex; 27 while (index >= 0) { 28 var parentIndex = gpi(index), parent = heap[parentIndex]; 29 if (parent && parent.key > key) { 30 heap[index] = parent; 31 index = parentIndex; 32 } else { 33 break; 34 } 35 } 36 heap[index] = node; 37 }, 38 39 __downHeap : function(index) { 40 var heap = this.__heap; 41 var node = heap[index], key = node.key, length = heap.length, max = floor(length / 2), glci = this.__getLeftChildIndex, grci = this.__getRightChildIndex; 42 while (index < max) { 43 var leftIndex = glci(index), 44 rightIndex = grci(index), left = heap[leftIndex], right = heap[rightIndex], child, childIndex; 45 if (rightIndex < length && right.key < left.key) { 46 childIndex = rightIndex; 47 child = right; 48 } else { 49 childIndex = leftIndex; 50 child = left; 51 } 52 if (child.key < key) { 53 heap[index] = child; 54 index = childIndex; 55 } else { 56 break; 57 } 58 59 } 60 heap[index] = node; 61 } 62 } 63 }); 64 65