Python中的递归二进制搜索

时间:2015-01-08 01:22:49

标签: python recursion binary-search

我试图理解这个功能几乎没有用。我完全理解二进制搜索是什么,但我只是对递归概念不熟悉,但对它有一点点把握。我第一次调用函数时,我真的不明白低和高的默认值是什么。截至目前,我只是包括我知道号码所在的搜索空间,但如果我不知道或者我不确定列表长度怎么办?否则,我理解这里发生的递归过程以及低和高参数的需要。以下功能在我正在参加的在线课程的笔记中提供;但是,它没有在讲座中解释,也没有关于它的文档字符串或参考文献。

def bSearch(L, e, low, high):
    if high - low < 2:
        return L[low] == e or L[high] == e
    mid = low + int((high-low)/2)
    if L[mid] == e:
        return True
    if L[mid] > e:
        return bSearch(L, e, low, mid-1)
    else:
        return bSearch(L, e, mid+1, high)

L = [1,3,6,15,34,84,78,256]
print bSearch(L, 15, 4, 8)
print bSearch(L, 84, 0, 6)

输出:

False
True

3 个答案:

答案 0 :(得分:1)

高和低似乎是要搜索的列表部分的索引。

在第一个示例中,15的索引为3,因此指定较低的4索引意味着15不包含在搜索空间中。在第二个示例中,84的索引为5,因此它包含在跨越索引06的搜索空间中。

这些指数也具有包容性。如果第二个例子是:

print bSearch(L, 84, 0, 5)

答案是:

True

如果您想搜索整个列表,只需执行以下操作:

print bSearch(L, 84, 0, len(L) - 1)

其中- 1是必需的,因为搜索功能是包容性的。

答案 1 :(得分:1)

二进制搜索。

bsearch(列表,要查找的元素,起始索引,结束索引)。 起始索引可以在函数开头处取为0 最后一个索引可以作为len(list)-1

bsearch的问题(L,15,4,8)。 U只搜索第5个元素和第9个元素,其中不存在数字。

在第二个函数调用中,您正在第一个元素和第五个元素之间搜索,其中存在一个数字。

对于任何其他数字,你可以将此函数称为bsearch(L,15,0,len(L) - 1)。

希望这有帮助。

答案 2 :(得分:0)

lowhigh指定算法必须搜索的L的索引。在第一个示例中,15具有索引3.这不在区间[4,8]中,因此它将返回false。在第二个示例中,L中的84的索引为5,这是在[0,6]区间内,因此这将返回True

如果您要搜索的号码不在L,则此方法将返回False。为什么?因为你最终是if (high-low) < 2的基本情况。在这种情况下,将检查L[high] or L[low]是否等于您要搜索的数字。如果两者都不是这样,则返回False。这是逻辑or的定义。

False or False = False False or True = True True or False = True True or True = True

如果您不确定列表长度,如果您提供的highlow值不在L范围内,则会产生错误。您可以添加一个额外的条件,这样就不会发生,但我认为这超出了本课程的范围。 :)