Python 二叉树解释为什么这样做

Python 二叉树解释为什么这样做,python,binary-search,Python,Binary Search,开始阅读一本关于使用此示例代码的基本数据结构和算法的书 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?

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

    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)
def二进制搜索(列表,项目):
低=0
高=长度(列表)-1#设置所提供列表长度的上限范围
而低项:
高=中-1
其他:
低=中+1
一无所获
我的清单=[1,3,5,7,9]
打印二进制搜索(我的搜索列表,3)
打印二进制搜索(我的搜索列表,-1)
虽然我理解树的概念,但我不明白为什么

mid=(低+高)#(低+高)为什么给我列表的中间位置

低+高不就是给我和高一样的值吗?我不需要低+高/2来找到中点吗?但它工作得很好

它之所以有效,是因为
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

因此您是正确的:您应该将
mid
除以2(并避免使用
list
作为变量名)。

它确实应该是
(低+高)//2
。现在的情况是,
mid
从列表中的最后一项开始,并始终通过
guess>项
条件的else部分。因此,
high
每次减少1,
low
从不改变(从零开始)。这个过程最终会从头到尾遍历所有元素,这根本不是二进制搜索(而是顺序搜索)。

你说的不对

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

  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
,但是high小于1


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

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