【问题标题】:Python - Altering my binary search functionPython - 改变我的二分搜索功能
【发布时间】:2013-04-01 09:15:28
【问题描述】:

我写了以下代码:

def binary_search(key,lst):
    """ iterative binary search
        lst better be sorted for binary search to work"""
    n=len(lst)
    lower=0
    upper=n-1
    outcome=None   # default value
    while lower<=upper:
        middle=(upper+lower)//2
        if key==lst[middle].name:    # item found
            outcome=lst[middle]
            break  # gets out of the loop if key was found
        elif key<lst[middle].name:   # item cannot be in top half
            upper=middle-1
        else:        # item cannot be in bottom half
            lower=middle+1           
    return outcome  

我正在尝试对其进行更改,以使其将列表分为 3 部分而不是 2 部分。 我的意思是它不再是二分搜索,但是对于每次迭代,算法会将列表分成 3 个部分。

我无法实现。

我们将不胜感激。

【问题讨论】:

  • 为什么要分成三部分?二分搜索的优点是您不需要进行太多比较(每次迭代只需一次)。对于三个部分,您在很多情况下需要进行两次比较(如果第一次比较给出适当的结果,您可能会短路),这超过了将搜索空间从 1/2 减少到 1/3 的好处迭代。
  • 这是一个作业。我知道它在任何方面都没有效率。

标签: python search binary


【解决方案1】:

您需要将列表分成 3 个部分,为此您需要两个中间部分:upper_middle 和 lower_middle。您需要在 if 中添加更多子句。如果小于下中间,则为前三分之一,如果高于上,则为后三分之一,否则为中三分之一。

请记住,即使这是一个很好的编程练习,它并没有真正提高效率,因为函数的顺序保持不变(log n)。

【讨论】:

  • 谢谢,我会试试看的。
  • 我试过了,但我仍然无法按照您描述的方式得到它。你的意思是我应该在列表中包含 3 个部分?中、中上、中下?我希望替换我自己的代码来进行这个搜索,而不是编写一个全新的代码,所以你能指导我更多吗?我无法将限制设置为默认值,并且不知道如何检查密钥是否在其中。
  • 是的,列表中需要三个部分。你需要重写整个函数。避免这种情况是没有意义的,你需要这样做,否则它不会是三次搜索。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多