二叉树解释为什么这样做
binary tree explanation why does this work
开始阅读使用此示例代码的有关基本数据结构和算法的书,
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
?
low + high 不会给我和 high 一样的价值吗?我不应该需要 low + high / 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
在您的示例中寻找 -1:
>>> print (binary_search([1,3,5,7,9],-1))
mid = 4
mid = 3
mid = 2
mid = 1
mid = 0
None
所以你是对的:你应该将 mid
除以 2(并避免使用 list
作为变量名)。
确实应该是(low+high)//2
。现在,mid
从列表中的最后一项开始,并始终通过 guess>item
条件的 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。
high 将继续递减,直到 guess == list[mid] == list[high] == list[1] == 3
开始阅读使用此示例代码的有关基本数据结构和算法的书,
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
?
low + high 不会给我和 high 一样的价值吗?我不应该需要 low + high / 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
在您的示例中寻找 -1:
>>> print (binary_search([1,3,5,7,9],-1))
mid = 4
mid = 3
mid = 2
mid = 1
mid = 0
None
所以你是对的:你应该将 mid
除以 2(并避免使用 list
作为变量名)。
确实应该是(low+high)//2
。现在,mid
从列表中的最后一项开始,并始终通过 guess>item
条件的 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。
high 将继续递减,直到 guess == list[mid] == list[high] == list[1] == 3