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

标签 python algorithm recursion binary-search

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

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/

相关文章:

algorithm - 证明 n! = O(n^n)

python - 将 pandas 数据框列中的值替换为前一个值

Python:尝试/除了 OSerror errno 2

algorithm - 如何检测转码音频的生成丢失

javascript - 如何在angularjs的递归指令中使用全局函数

c - 尝试递归循环文件夹内容

python - 获取或操作 Selenium Webdriver 中的所有 cookie

python - 如何修改 Pandas DataFrame 并插入新列

algorithm - 动态范围搜索

python - Python 中的家谱