【发布时间】:2015-10-03 02:54:04
【问题描述】:
我已经看到了这个算法的很多不同的实现,但我想知道除了使搜索二进制之外,是否还有其他方法可以提高效率。我设计了这个特定版本的算法,因此将立即检查数组/列表的边缘和中点是否有正在搜索的键,以避免在您要查找的键只是第一个、中间的键时循环搜索,或最后一个元素。
def searchRB(the_array, the_key, imin, imax):
print("searching")
found = False
if (0 > the_key or the_key > len(the_array)):
return found
else:
imid = imin + ((imax - imin) // 2)
if imid == the_key or imin == the_key or imax == the_key:
found = True
return found
elif the_array[imid] > the_key:
return searchRB(the_array, the_key, imin, imid-1)
elif the_array[imid] < the_key:
return searchRB(the_array, the_key, imid+1, imax)
else:
return found
例如,如果您在 1-100 的列表中查找数字 1,这将在第一个循环中找到它,这与其他一些实现不同。
但是,我不确定这是否真的提高了效率(某些边缘情况除外),并且如果您继续循环检查列表/数组中的第一个、中间和结束值实际上是有害的,并且每次都必须检查这三个值。
这种算法的实现是好是坏,还是我只是扯淡?
【问题讨论】:
-
迭代二分查找会更高效。
-
很有趣,您能详细说明一下为什么会这样吗?
-
如何开始搜索? the_key、imin、imax 的值是多少?
-
the_key = 您要搜索的数字,imin = 您搜索范围内的最小值,imax = 您搜索范围内的最大值。
-
因为迭代实现避免了更多函数调用的开销,这在 Python 中并不是非常快。我认为这是分裂的头发,是的:渐近(
the_array的大小变大),快速识别端点并没有好处。与元素的数量相比,可能的端点数量非常少,因此您会在平均元素检查上浪费额外的时间来检查罕见情况。此外,found变量没有用:只需返回False、True和False(分别)在您现在返回found的位置,并删除两行found = <bool-const>。
标签: python algorithm recursion binary-search