gpt4 book ai didi

python - 这种递归二分搜索算法可以更有效吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:57:11 25 4
gpt4 key购买 nike

我见过很多这种算法的不同实现,但我想知道除了使搜索二进制之外是否还有提高效率的方法。我设计了这个特定版本的算法,因此将立即检查数组/列表的边缘和中点以查找正在搜索的键,以避免在您要查找的键只是第一个,中间时循环搜索, 或最后一个元素。

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,这将在第一个循环中找到它,这与其他一些实现不同。

但是,我不确定这是否真的提高了效率(某些边缘情况除外),并且如果继续循环并检查列表/数组中的第一个、中间和结束值实际上是有害的,并且每次都必须检查这三个值。

这种算法的实现是好是坏,还是我只是吹毛求疵?

最佳答案

最重要的是从递归方法转变为使用 while 循环,从而节省调用堆栈(因为 python 没有尾递归)。

您有可以优化的小冗余。算法已经足够优化了,不要over optimise除非你了解编译器

如果你沿着左边的树向下走,你会一遍又一遍地比较相同的 imin,但是整行可能是并行的或顺序完成的

如果 the_array[imid] == the_key 或 the_array[min] == the_key 或 the_array[imax] == the_key:

这也可能会影响缓存性能,因为您将始终将 the_array[min] 保存在缓存中。有时,编译器会在您尝试在缓存中访问的索引周围的数组中存储一个 block 。您可能浪费了比仅仅为那 1 个值更多的缓存。

像这样的语句也可以被优化,你可以只输入 return True ,但是这应该被编译器拾取。

发现 = True
返回找到

不将 found 作为对象会优化代码,因为该对象不会一直存储在内存中。

这个 else 语句似乎是多余的,因为没有可能的方法去到那个 else其他
返回找到

实际相关的优化将来自对数据集的更多了解。

如果您能够预处理数据(或了解有关数据的更多信息),则可以执行其他算法。

关于python - 这种递归二分搜索算法可以更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32918436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com