Last active
September 20, 2023 09:23
-
-
Save Phryxia/7195b68566bc77e4c2f47988077770f8 to your computer and use it in GitHub Desktop.
TypeScript implementation of binary search and it's variant (less/less or equal)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export function createExactFinder<T>(comp: (a: T, b: T) => number) { | |
return (list: T[], target: T) => { | |
let l = 0 | |
let r = list.length - 1 | |
while (l <= r) { | |
const m = Math.ceil((l + r) / 2) | |
const c = comp(list[m], target) | |
if (c === 0) return m | |
if (c > 0) { | |
r = m - 1 | |
} else { | |
l = m + 1 | |
} | |
} | |
return -1 | |
} | |
} | |
export function createMaxLessFinder<T>(comp: (a: T, b: T) => number) { | |
return (list: T[], target: T) => { | |
let l = 0 | |
let r = list.length - 1 | |
while (l < r) { | |
const m = Math.ceil((l + r) / 2) | |
if (comp(list[m], target) >= 0) { | |
r = m - 1 | |
} else { | |
l = m | |
} | |
} | |
if (comp(list[r], target) >= 0) return -1 | |
return r | |
} | |
} | |
export function createMaxLessOrEqualFinder<T>(comp: (a: T, b: T) => number) { | |
return (list: T[], target: T) => { | |
let l = 0 | |
let r = list.length - 1 | |
while (l < r) { | |
const m = Math.ceil((l + r) / 2) | |
if (comp(list[m], target) > 0) { | |
r = m - 1 | |
} else { | |
l = m | |
} | |
} | |
if (comp(list[r], target) > 0) return -1 | |
return r | |
} | |
} | |
export function createMinGreaterFinder<T>(comp: (a: T, b: T) => number) { | |
return (list: T[], target: T) => { | |
let l = 0 | |
let r = list.length - 1 | |
while (l < r) { | |
const m = Math.floor((l + r) / 2) | |
if (comp(list[m], target) <= 0) { | |
l = m + 1 | |
} else { | |
r = m | |
} | |
} | |
if (comp(list[r], target) <= 0) return -1 | |
return r | |
} | |
} | |
export function createMinGreaterOrEqualFinder<T>(comp: (a: T, b: T) => number) { | |
return (list: T[], target: T) => { | |
let l = 0 | |
let r = list.length - 1 | |
while (l < r) { | |
const m = Math.floor((l + r) / 2) | |
if (comp(list[m], target) < 0) { | |
l = m + 1 | |
} else { | |
r = m | |
} | |
} | |
if (comp(list[r], target) < 0) return -1 | |
return r | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage
list
for the parameter of these functions MUST be sorted under same comparator.createExactFinder
list
where such element satisfiescomp(list[i], target) === 0
createMaxLessFinder
list
where such element satisfiescomp(list[i], target) < 0
createMaxLessOrEqualFinder
list
where such element satisfiescomp(list[i], target) ≤ 0
createMinGreaterFinder
list
where such element satisfiescomp(list[i], target) > 0
createMinGreaterOrEqualFinder
list
where such element satisfiescomp(list[i], target) ≥ 0