algorithm: add autoBisect

This commit is contained in:
2024-06-21 18:34:38 +08:00
parent 8e39e3e368
commit 411a14451f

View File

@@ -23,3 +23,29 @@ export function binSearch(begin: number, end: number, beforeHalf: boolean[]): [n
return [begin, half, end];
}
export async function autoBisect(
begin: number,
end: number,
check: (
begin: number,
end: number,
index: number
) => Promise<boolean>) {
// Try to find the first index where check() predicates to true.
// Assume check() is true at first, for range [begin, end)
let index = 0;
while (end - begin > 1) {
const mid = Math.floor((end - begin) / 2) + begin;
if (await check(begin, mid, index)) {
// Shrink half range.
end = mid;
} else {
begin = mid;
}
index++;
}
return begin;
}