-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
四种版本的二分查找算法 #1
Comments
def bin_find_v3(v, lo, hi, e):
if lo < hi - 1:
mi = (lo + hi) // 2
if e < v[mi]:
hi = mi
else:
lo = mi
return bin_find_v3(v, lo, hi, e)
return (lo if v[lo] == e else -1)
v = [1, 2, 3, 4, 5, 6, 7]
bin_find_v3(v, 0, len(v), 4) 版本三:两个区间的二分查找,查找不到时返回 -1 |
def bin_find_v4(v, lo, hi, e):
if lo < hi:
mi = (lo + hi) // 2
if e < v[mi]:
hi = mi
else:
lo = mi + 1
return bin_find_v4(v, lo, hi, e)
return lo - 1
v = [1, 2, 3, 4, 5, 6, 7]
bin_find_v4(v, 0, len(v), 4) 版本四:两个区间的二分查找,返回不大于e的最后一个元素的 rank |
版本 2: 黄金分割二分查找def bin_find_v2(v, lo, hi, e):
fib = Fib(hi - lo)
while lo < hi:
while hi - lo < fib.get():
fib.prev()
mi = lo + fib.get() - 1
if e < v[mi]:
hi = mi
elif e > v[mi]:
lo = mi
else:
return mi
return -1
class Fib(object):
def __init__(self, n):
self._f = 1
self._g = 0
while self._g < n:
self.next()
def next(self):
self._g, self._f = self._g + self._f, self._g
return self._g
def prev(self):
self._g, self._f = self._f, self._g - self._f
return self._g
def get(self):
return self._g
v = [1, 2, 3, 4, 5, 6, 7]
print(bin_find_v2(v, 0, len(v), 5)) |
Open
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
版本一:三个区间的二分查找,且头尾区间不均衡。
Python tutor 演示链接
The text was updated successfully, but these errors were encountered: