Spaces:
Sleeping
Sleeping
File size: 1,264 Bytes
90cbf22 |
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 |
// 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;
},
};
}
|