【问题标题】:How to determine the time complexity for the following algorithms?如何确定以下算法的时间复杂度?
【发布时间】:2020-11-09 23:12:42
【问题描述】:

我明天有期中考试,很难理解以下时间复杂度问题。

1.

Algorithm foo(n)
     i←0
     j←0
     while i<n do {
         if j=i then j←j+1
         else if j=2i then i←n−j
         else {
             i←i+1
             j←j+1
         }
     }

这是 O(1)

2.

Algorithm foo(n)
     i←0
     j←0
     while i<n do {
         if i=k then {
             A[i]←k
             k←k+1
             i←1
         }
     }
     else i←i+1

O(n^2)

所以基本上,我解决这类问题的方法是找到算法中执行恒定数量操作的部分。对于算法 1,这将是变量和循环内的内容:

C1:

i←0
j←0

C2:

if j=i then j←j+1
         else if j=2i then i←n−j
         else {
             i←i+1
             j←j+1

然后,我计算循环的迭代次数n,并将其添加到公式中:

f(n) = C1+nC2 是 O(n)(错误答案)

我可以说我的问题是我错误地计算了这两个循环的迭代次数。如果有人可以让我知道我的思维过程是否完全错误和/或我应该如何计算循环迭代,那将不胜感激。

【问题讨论】:

    标签: algorithm time while-loop time-complexity computer-science


    【解决方案1】:

    您是否实施了算法并只是看看会发生什么?如果你还没有的话,你应该这样做。

    示例 1

    def bigo_one(n):
        print(f"n == {n}")
        i = 0
        j = 0
        while i<n:
            if j==i:
                j = j + 1
            elif j == 2 * i:
                i = n - j
            else:
                i = i + 1
                j = j + 1
            print(i, j)
    
    bigo_one(10)
    bigo_one(100)
    bigo_one(1000)
    

    输出:

    n == 10
    0 1
    1 2
    8 2
    9 3
    10 4
    n == 100
    0 1
    1 2
    98 2
    99 3
    100 4
    n == 1000
    0 1
    1 2
    998 2
    999 3
    1000 4
    

    从输出中很容易看出总是发生的事情,与 n 无关:

    1. j 增加到 2
    2. i 跳转到 n-2
    3. i 增加到 n

    这总是 5 步 -> O(1)

    示例 2

    def bigo_nsquare(n):
        print(f"n == {n}")
        i = 0
        j = 0
        while i<n:
            if j==i:
                j = j + 1
                i = 1
            else:
                i = i + 1
            print(i, j)
            
    bigo_nsquare(2)
    bigo_nsquare(4)
    bigo_nsquare(10)
    

    输出:

    n == 2
    1 1
    1 2
    2 2
    n == 4
    1 1
    1 2
    2 2
    1 3
    2 3
    3 3
    1 4
    2 4
    3 4
    4 4
    n == 10
    1 1
    1 2
    2 2
    1 3
    2 3
    [...]
    

    这个循环正在遍历方阵的下三角形,因此它的复杂度为 O(n²) 是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多