Spaces:
Sleeping
Sleeping
// Basic 1-indexed minheap implementation | |
export function MinHeap<T>(compare: (a: T, b: T) => boolean) { | |
const tree = [null as T]; | |
let endIndex = 1; | |
return { | |
peek: (): T | undefined => tree[1], | |
length: () => endIndex - 1, | |
push: (newValue: T) => { | |
let destinationIndex = endIndex++; | |
let nextToCheck; | |
while ((nextToCheck = destinationIndex >> 1) > 0) { | |
const existing = tree[nextToCheck]; | |
if (compare(newValue, existing)) break; | |
tree[destinationIndex] = existing; | |
destinationIndex = nextToCheck; | |
} | |
tree[destinationIndex] = newValue; | |
}, | |
pop: () => { | |
if (endIndex == 1) return undefined; | |
endIndex--; | |
const value = tree[1]; | |
const lastValue = tree[endIndex]; | |
let destinationIndex = 1; | |
let nextToCheck; | |
while ((nextToCheck = destinationIndex << 1) < endIndex) { | |
if (nextToCheck + 1 <= endIndex && compare(tree[nextToCheck], tree[nextToCheck + 1])) | |
nextToCheck++; | |
const existing = tree[nextToCheck]; | |
if (compare(existing, lastValue)) break; | |
tree[destinationIndex] = existing; | |
destinationIndex = nextToCheck; | |
} | |
tree[destinationIndex] = lastValue; | |
return value; | |
}, | |
}; | |
} | |