diff options
author | dusoleil <howcansocksbereal@gmail.com> | 2021-08-01 23:25:54 -0400 |
---|---|---|
committer | dusoleil <howcansocksbereal@gmail.com> | 2021-08-01 23:25:54 -0400 |
commit | 28179e084e0c45137d62b4fe7b8dc9826bfd2fab (patch) | |
tree | 73a3fd199f4ea4162a270685df9c26731dc3a348 /tools/bsearch.py | |
parent | 9fc044075cfde81ff351766dcee3bc99d89b6951 (diff) | |
download | lib-des-gnux-28179e084e0c45137d62b4fe7b8dc9826bfd2fab.tar.gz lib-des-gnux-28179e084e0c45137d62b4fe7b8dc9826bfd2fab.zip |
Adding Various Small Tools
Signed-off-by: dusoleil <howcansocksbereal@gmail.com>
Diffstat (limited to 'tools/bsearch.py')
-rw-r--r-- | tools/bsearch.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tools/bsearch.py b/tools/bsearch.py new file mode 100644 index 0000000..1c92343 --- /dev/null +++ b/tools/bsearch.py @@ -0,0 +1,44 @@ +#binary search +#searches for an s in i that satisfies x == f(i[s]) +#i = iterable +#f = function to call on each element of i +#x = value to search for +#start = offset into iterable to start +#end = offset into iterable to end +#if it finds a match, it returns a tuple of (s,i[s],f(i[s])) +#if it does not find a match, it returns (-1,None,None) +def bsearch(i,f,x,start=0,end=-1): + if end == -1: + end = len(i)-1 + #s = _bsearch(i,f,start,end,x) + s = _bsearch2(i,f,start,end,x) + return (s,i[s],f(i[s])) if s != -1 else (s,None,None) + +#recursive +def _bsearch(i,f,lo,hi,x): + if hi >= lo: + md = (hi+lo)//2 + a = f(i[md]) + if a == x: + return md + elif a > x: + return _bsearch(i,f,lo,md-1,x) + else: + return _bsearch(i,f,md+1,hi,x) + else: + return -1 + +#loop +def _bsearch2(i,f,lo,hi,x): + while True: + if hi >= lo: + md = (hi+lo)//2 + a = f(i[md]) + if a == x: + return md + elif a > x: + hi = md-1 + else: + lo = md+1 + else: + return -1 |