Python中反向排序列表的二进制搜索
已经有一个主题是关于如果列表按升序排序,如何在Python中使用对分模块进行二进制搜索: 有没有一种好的方法可以对排序相反的列表进行二进制搜索?这是关于它的说明: 与sorted()函数不同,bisect()函数具有键或反转参数是没有意义的,因为这会导致设计效率低下(对bisect函数的连续调用不会“记住”以前所有的键查找) 因此,它不支持自定义订单。任何绕过它的尝试(如两次反转列表,或准备一个单独的键列表)都需要线性时间,这将完全破坏二进制搜索的点,这是对数的 下面是接受比较器的二进制搜索的实现 def对分(arr、val、cmp): l=-1 r=len(arr) 当r-l>1时: e=(l+r)>>1 如果cmp(arr[e],val):l=e 其他:r=e 返回r 它的行为类似于Python中反向排序列表的二进制搜索,python,binary-search,Python,Binary Search,已经有一个主题是关于如果列表按升序排序,如何在Python中使用对分模块进行二进制搜索: 有没有一种好的方法可以对排序相反的列表进行二进制搜索?这是关于它的说明: 与sorted()函数不同,bisect()函数具有键或反转参数是没有意义的,因为这会导致设计效率低下(对bisect函数的连续调用不会“记住”以前所有的键查找) 因此,它不支持自定义订单。任何绕过它的尝试(如两次反转列表,或准备一个单独的键列表)都需要线性时间,这将完全破坏二进制搜索的点,这是对数的 下面是接受比较器的二进制搜索的实
bisect\u right
,如果需要bisect\u left
,则在末尾返回l
。下面是一个反向数组的用法示例:
>>> a = [10**8 - x for x in range(10**8)]
>>> bisect(a, 100, lambda x, y: x > y)
99999900
在这种情况下,使用代码片段复制库函数是有益的,例如下面的
bisect\u left
和bisect\u right
。通过将
=
),可以获得降序数组的对分搜索
def bisect_left(a, x, lo=0, hi=None):
if hi is None: hi = len(a)
while lo < hi:
mid = (lo + hi)//2
if a[mid] < x: lo = mid + 1
else: hi = mid
return lo
def bisect_right(a, x, lo=0, hi=None):
if hi is None: hi = len(a)
while lo < hi:
mid = (lo + hi)//2
if a[mid] <= x: lo = mid + 1
else: hi = mid
return lo
def对分_左(a,x,lo=0,hi=None):
如果hi为无:hi=len(a)
当lo如果哈哈哈,你的Python实现比我的更快。。。删除了我的答案。我仍然感到惊讶的是,两次数组反转(可能也会分配内存)比一次list.index(仅一次扫描)快。如果我没有亲眼看到,我是不会相信的。同意。。。一定是比较贵。