二进制搜索功能python

时间:2015-04-02 19:05:38

标签: python-2.7

下面的第一个函数搜索调用时提供的某个数字。目标是减少搜索机制的大小。每当它查找数字时,它只查找两端并减少查找一半的效率。

def bsearch(s, e, first, last, calls):
    print (first, last, calls)
    if (last - first) < 2: return s[first] == e or s[last] == e
    mid = first + (last - first)/2
    if s[mid] == e: return True
    if s[mid] > e: return bsearch(s, e, first, mid - 1, calls + 1) 
    return bsearch(s, e, mid + 1, last, calls + 1)
def search(s,e):
    print bsearch(s, e, 0, len(s) - 1, 1)

当我像这样运行时:

s = range(1000000)
x = search(s, 5000000)
print x

它产生如下结果:

(0, 999999, 1)
(500000, 999999, 2)
(500000, 749998, 3)
(500000, 624998, 4)
(500000, 562498, 5)
(500000, 531248, 6)
(500000, 515623, 7)
(500000, 507810, 8)
(500000, 503904, 9)
(500000, 501951, 10)
(500000, 500974, 11)
(500000, 500486, 12)
(500000, 500242, 13)
(500000, 500120, 14)
(500000, 500059, 15)
(500000, 500028, 16)
(500000, 500013, 17)
(500000, 500005, 18)
(500000, 500001, 19)
True

注意它如何减少查找机制。但我被困在这里:

if s[mid] > e: return bsearch(s, e, first, mid - 1, calls + 1) 
    return bsearch(s, e, mid + 1, last, calls + 1)

无法理解它在这里做什么。任何人都可以解释

1 个答案:

答案 0 :(得分:1)

这是递归的经典示例:一个函数调用自身,但使用不同的参数(在此特定情况下,第一个最后)。请注意,该函数假定搜索的序列是有序的:每个后续成员都不小于前一个成员。这使得每次递归调用都可以将搜索到的空间减少一半,因为很明显可以发生目标 e 的一半。