【问题标题】:How is the time complexity of 2 nested while loops is o(N) in my function fixing?在我的函数修复中,2 个嵌套的 while 循环的时间复杂度如何为 o(N)?
【发布时间】:2020-11-20 14:46:16
【问题描述】:

输入 = [10, 9, 7, 18, 13, 19, 4, 20, 21, 14]
输出:10 9 18 7 20 19 4 13 14 21

def fixing(arr):
    oddIdx = 1
    evenIdx = 0
    while True:
        while evenIdx < len(arr) and arr[evenIdx] %2 ==0:
            evenIdx +=2
        while oddIdx < len(arr) and arr[oddIdx] % 2!=0:
            oddIdx+=2
        if evenIdx < len(arr) and oddIdx < len(arr):
            arr[evenIdx], arr[oddIdx] = arr[oddIdx], arr[evenIdx]
        else:
            break
    return arr

是因为我们没有忽略外循环吗?如果是,为什么,如果不是,为什么不呢?谢谢!

【问题讨论】:

    标签: python list algorithm time-complexity


    【解决方案1】:

    让我们分解一下。

    while True 的条件取决于evenIdx &lt; len(arr) and oddIdx &lt; len(arr)

    所以外部循环不会迭代超过 O(N) 其中N=len(arr)

    但是内部循环呢?

    让我们考虑一下这里的选项:

    1. 我们只有 1 次外部循环迭代,其中内部函数推进 evenIdxoddIdx 到我们中断的点。所以总体 O(N)。
    2. 外部循环迭代 K 次。但是evenIdxoddIdx 不要重置。在迭代 1 中,evenIdx/oddIdx 到达 0 到 N 之间的某个位置,迭代 2 它们仍然继续前进,迭代 3 到迭代 K 也是如此。最终 evenIdx/oddIdx 前进了 O(N) 次。所以又是 O(N)。

    可以进行更严格的分析,但仍然是 O(N)。

    【讨论】:

      【解决方案2】:

      这是因为您没有每次通过外循环将evenIdxoddIdx 重置回0。每次外循环重复时,内循环都会从上次中断的地方开始。

      因此,您不会对列表执行多次迭代——只要两个内循环都到达末尾,您就会跳出外循环。并且每个内部循环只访问偶数或奇数元素一次。

      【讨论】:

      • 你怎么知道内循环到达终点?
      • 如果内部循环还没有到达末尾,if 语句会交换偶数和奇数元素。这意味着在前一次迭代中失败的偶数/奇数测试将成功,因此它将再次增加索引。最终这个过程将结束。
      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多