【问题标题】:binary tree explanation why does this work二叉树解释为什么这样做
【发布时间】:2019-03-18 21:10:53
【问题描述】:

开始阅读有关使用此示例代码的基本数据结构和算法的书,

    def binary_search(list, item):
    low = 0  
    high = len(list)-1  #sets upper range to length of provided list

    while low <= high:
        mid = (low + high) #why does (low + high) give me middle of list?
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

my_list = [1,3,5,7,9]

print binary_search(my_list,3)
print binary_search(my_list,-1)

虽然我理解树的概念但不明白为什么

mid = (low + high) #why does (low + high) give me middle of list? 低+高不会给我与高相同的价值吗?我不应该需要低 + 高 / 2 来找到中点吗?但它工作得很好?

【问题讨论】:

  • 不应该是(低+高)//2 ?
  • 你说得对,它应该是mid = (low + high)//2。它仍然有效,因为它不需要中间,但运行时间更长,因为它只通过完整列表而不是“跳过”是
  • "//" 2 解决了我在 python shell 中取回疯狂小数的另一个问题,谢谢!在这一点上,我需要回去看看我以前从未真正使用过的运算符。

标签: python binary-search


【解决方案1】:

之所以有效,是因为mid 始终在正确的范围内,但这是线性搜索,而不是二元搜索。您可以通过打印检查的索引来检查这一点:

def binary_search(list, item):
    low = 0  
    high = len(list)-1  #sets upper range to length of provided list

    while low <= high:
        mid = (low + high) #why does (low + high) give me middle of list?
        print("mid =", mid)
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1

在您的示例中寻找 -1:

>>> print (binary_search([1,3,5,7,9],-1))
mid = 4
mid = 3
mid = 2
mid = 1
mid = 0
None

所以你是对的:你应该将mid 除以 2(并避免使用list 作为变量名)。

【讨论】:

    【解决方案2】:

    确实应该是(low+high)//2。就像现在一样,mid 从列表中的最后一项开始,总是经过guess&gt;item 条件的 else 部分。所以high 每次减少 1,low 永远不会改变(从零开始)。该过程最终从最后一个到第一个遍历所有元素,这根本不是二进制搜索(而是顺序搜索)。

    【讨论】:

      【解决方案3】:

      你是对的,这是不正确的!

      它会给你正确的结果,但让我们看看实际发生了什么。

        if guess == item:
          return mid
        if guess > item:
          high = mid - 1
        else:
          low = mid + 1
      

      在第一次迭代中,guess == list[mid] == list[high] == 9。 3 小于 9,所以高会递减。

      在下一次迭代中,再次mid == high,但高低 1。

      high 将继续递减,直到guess == list[mid] == list[high] == list[1] == 3

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多