如何从lib定义python binsearch算法的不变量?

时间:2017-12-08 20:53:14

标签: python algorithm

我在python lib中找到了以下代码:

def bisect_left(a, x, lo=0, hi=None):
    if lo < 0:
        raise ValueError('lo must be non-negative')
    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

返回索引在列表a中插入项x的索引,假设a已排序。 返回值i使得[:i]中的所有e都具有e&lt; x,以及所有e in a [i:]有e&gt; = x。

此算法的不变量是什么?我想明白这是正确的。

1 个答案:

答案 0 :(得分:0)

该算法称为Binary Search Alorithm。它在排序列表上工作以在O(logn)中查找元素(通常在列表中查找元素需要O(n)迭代所有元素)。它背后的魔力如下:假设你有一个从1到1000的排序数组。你想检查247是否存在,一种方法是迭代所有元素,但另一种方法是使用BST,即检查中值,如果它大于247,这意味着如果这个数组上存在247,它应该放在数组的第一个中的某个位置,这样你只需忽略后半部分,依此类推。