Matou-Garou / convex /util /minheap.ts
Jofthomas's picture
Jofthomas HF staff
bulk
ce8b18b
raw
history blame
1.26 kB
// 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;
},
};
}