Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中反向排序列表的二进制搜索_Python_Binary Search - Fatal编程技术网

Python中反向排序列表的二进制搜索

Python中反向排序列表的二进制搜索,python,binary-search,Python,Binary Search,已经有一个主题是关于如果列表按升序排序,如何在Python中使用对分模块进行二进制搜索: 有没有一种好的方法可以对排序相反的列表进行二进制搜索?这是关于它的说明: 与sorted()函数不同,bisect()函数具有键或反转参数是没有意义的,因为这会导致设计效率低下(对bisect函数的连续调用不会“记住”以前所有的键查找) 因此,它不支持自定义订单。任何绕过它的尝试(如两次反转列表,或准备一个单独的键列表)都需要线性时间,这将完全破坏二进制搜索的点,这是对数的 下面是接受比较器的二进制搜索的实

已经有一个主题是关于如果列表按升序排序,如何在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 它的行为类似于
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(仅一次扫描)快。如果我没有亲眼看到,我是不会相信的。同意。。。一定是比较贵。