【问题标题】:understanding while loop in python理解python中的while循环
【发布时间】:2017-06-15 00:24:12
【问题描述】:

我对Python还很陌生,正在尝试学习算法,我想问一下为什么我在查看列表时使用low < hi会出现逻辑错误,正确的逻辑操作是@987654322 @,它正在防止的边缘情况是什么。

def binary_search(input_array, value):
    """Your code goes here."""
    #O(log(n))
    low = 0
    hi = len(input_array) - 1 
    while low <= hi: #why cant it be low < hi
        mid = (low + hi)//2
        if input_array[mid] == value:
            return mid
        elif input_array[mid] < value:
            print(low, hi)
            low = mid + 1
        else:
            hi = mid - 1
    return -1


test_list = [1,3,9,11,15,19,29]
test_val1 = 25
test_val2 = 15
print(binary_search(test_list, test_val1))
print(binary_search(test_list, test_val2))

【问题讨论】:

  • 考虑编辑问题并附加您遇到的引发异常。猜谜游戏在这里被严厉否决:D
  • @Juggernaut - 这里没有猜谜游戏。他没有得到例外,他在询问算法的逻辑。正如答案所指出的,如果你改变逻辑,你不会得到异常,但会得到更糟糕的结果:错误的答案。

标签: python python-3.x data-structures


【解决方案1】:

假设您只有一个元素 [1],而您正在搜索 1

&lt; : return -1 因为你会跳过循环

&lt;=:返回正确的值

【讨论】:

    【解决方案2】:

    当你的目标是,例如在你的情况下,15:

    第一次迭代索引:low == 4hi == 6

    第二次迭代索引:low == 4hi == 4

    如果您使用 low false。即使该值在索引 4 上,您的程序也会认为它找不到该值。

    【讨论】:

      【解决方案3】:

      你可以如果你写过
      hi = len(input_array)
      while low < hi: # now this works.
      ...

      事实上,这就是我通常编写这些循环的方式。利用len() 总是比最后一个索引多1 的事实,并且仅在索引为&lt; 该值时运行循环。

      如果你从len(input_array) 中减去 1,那么 hi 的最大值 数组中的最后一个索引,那么为了破坏最后一个元素上的循环,你需要=low &lt;= hi的一部分

      通常(在心理上)更容易设置 hi = len(input_array),它是最后一个索引之后的 1,然后仅在 low&lt;hi 时运行循环。
      (少打字,少锻炼脑力)。
      在这种情况下,一旦low==hi 越过了最后一个索引,它就会越界。

      您所指的“边缘情况”是您要确保在 所有 元素(索引)上运行循环。 因此,您需要以一种或另一种方式查看数组中的最后一个索引/元素。

      基本上有两种常用的编码方式,但不能混淆。确保您的最终条件与您的初始条件相关。

      您将hi 设置为什么(数组的长度或数组的最后一个索引)决定了您要使用low &lt; hi 还是low &lt;= hi

      【讨论】:

        【解决方案4】:

        我们使用&lt;= 而不仅仅是&lt;,因为在所需值恰好是最后一个索引的情况下(当low=hi 时),我们需要包含一个等号来检查这种情况。

        【讨论】:

          猜你喜欢
          • 2017-10-03
          • 2014-11-02
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 2013-10-29
          • 1970-01-01
          • 2019-12-05
          • 2020-05-27
          相关资源
          最近更新 更多