这种递归二进制搜索算法能更有效吗?

时间:2015-10-03 02:54:04

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

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

这种算法的实现是好是坏,还是我只是分裂?

1 个答案:

答案 0 :(得分:2)

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

您可以优化小的裁员。 算法已经足够优化,除非你理解编译器

,否则不要over optimise

如果您要从左侧的树上走下去,那么您将一遍又一遍地比较相同的imin,但是整条线可以并行化或顺序完成

if the_array[imid] == the_key or the_array[min] == the_key or the_array[imax] == the_key:

此外,这可能会影响缓存性能,因为您将始终将the_array [min]保留在缓存中。有时编译器会在您尝试在缓存中访问的索引周围存储数组中的块。 你可能会浪费更多的缓存而不仅仅是为了那个值。

此类语句也可以进行优化,您只需键入return True,但这应该由编译器选择。

found = True return found

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

这个其他声明似乎是多余的,因为没有可能的方法来达到其他目的 else return found

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

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