【问题标题】:How can I tell how many times these nested statements will execute?我如何知道这些嵌套语句将执行多少次?
【发布时间】:2015-06-12 06:10:44
【问题描述】:

我有以下伪代码:

SelectionSort(A)
    n = A.length
    for j=1 to n-1
        smallest = j
        for i=(j+1) to n
            if A[i] < A[smallest]
                smallest = i
        exchange A[j] with A[smallest]

我认为第一个for循环测试会执行n次,嵌套的for循环会执行1 + 2 + ... + n = n(n+1)/2次(如果我有请纠正我'我错了)。但我不明白如何知道嵌套的 if 语句将执行多少次?是 1/2 * n(n+1)/2 吗?

【问题讨论】:

    标签: algorithm sorting big-o time-complexity complexity-theory


    【解决方案1】:

    外部 for 循环将运行 n 次。但是,它还包含一个内部 for 循环,该循环依赖于 j 的值。

    我认为第一个 for 循环测试将执行 n 次,并且 嵌套的 for 循环将执行 1 + 2 + ... + n = n(n+1)/2 次。

    基于外部for循环的所有迭代,内部for循环将运行(n-1)+(n-2)+...+1次。因此,循环语句的净迭代组合将是 (n-1) + (n-2) + (n-3) + ... + 1 = (n-1)*n/2 = (n2-n)/2 次。

    但我不明白我怎么知道嵌套了多少次 if 语句会执行吗?是 1/2 * n(n+1)/2 吗?

    由于 inner-if 语句依赖于数组元素,因此无法直接确定它将运行多少次。

    但是,可以肯定的是,在最坏情况下,由于它位于内部 for 循环中,因此 if 语句的最大可能执行次数(在最坏情况下)将是 (n2-n)/2 次。

    因此,执行 if 语句的最坏情况复杂度是 O(n2)

    【讨论】:

    • 但是当 j = 1 时,内循环不会在外循环的第一次迭代中运行 n 次吗?
    • @AliMustafa-No,因为 i 的值将设置为 2(因为 i=j+1),这意味着它将循环从 i=2 迭代到 i=n,意味着总共n-1 次迭代。
    • 好的,你能看看我是否说对了:外部for循环头执行n次,外部for循环体执行n-1次?内部for循环头执行n次,内部for循环体执行n-1次?当 j=1
    • 是的,你是对的。 for-loop 的头部比它们的主体多执行一次,因为在每个条目上都会检查测试条件,在不满足条件的情况下会变为 false,因此循环终止。而且,我建议您不要过多考虑循环头,而只考虑循环体的执行次数。从长远来看,这将对您有所帮助。祝你好运。 :) @AliMustafa
    【解决方案2】:

    外循环应从 1 运行到 n-1,因此 n-1 次。
    内循环应从 j+1 运行到 n 次。这意味着当 j 为 1 时,它将运行 2 到 n 次(n-1 次),当 j 为 n-1 时,它将运行 n 到 n 次(1 次)。

    因此内部循环应运行 (n-1 + n-2 + ... + 1) 次 = n(n-1)/2 次。

    if 语句的执行次数应与内部循环执行的次数相同。当然,条件语句应取决于 if 条件的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多