如何找到一系列算法的时间复杂度?

时间:2016-10-29 14:41:54

标签: algorithm time-complexity series

如何找到产生系列求和的以下算法的复杂性。

系列:1+(1 + 2)+(1 + 2 + 3)+ ....... +(1 + 2 + 3 + ... + n)

算法:

with open('oldfile.csv', newline='') as old:
    r = csv.reader(old)
    num_cols = int(input("How many columns: "))
    entry_generator = (entry for row in r for entry in row)
    with open('newfile.csv', 'w+', newline='') as newfile:
        w = csv.writer(newfile)
        while True:
            try:
                w.writerow([next(entry_generator) for _ in range(num_cols)])
            except StopIteration:
                break

2 个答案:

答案 0 :(得分:0)

要查找时间复杂度,请分析核心(在循环内)运行的次数。

外部循环运行n次,因此复杂度至少 O(n)。

运行内部循环

  • 一次当i = 1
  • 时 当li = 2 时,
  • 两次
  • ......当i = n
  • 时n次

所以它运行的总次数是1和n之间的整数之和:(n *(n + 1))/ 2 = n ^ 2/2 + n / 2,这是为O(n ^ 2)

另一方面,

空间复杂性在这种情况下更简单。由于内存要求不依赖于输入长度,上述算法的空间复杂度为 O(1)(意味着所需的内存量相同(基本上是{{1的大小)无论n和天气,结果都适合sum)。

请注意,对于相同的任务,不同的算法可能具有不同的复杂性。正如@AxelKemper在他的评论中正确指出的那样,你可以将解决方案表达为n的单个多项式,因此最有效的解决方案将具有O(1)的复杂性。但是,上述算法不能以这种方式工作,并且具有更高的复杂性。

答案 1 :(得分:0)

总和

  

1+(1 + 2)+(1 + 2 + 3)+ ...... +(1 + 2 + 3 + ... + n)的

等于

  

1/2(1 + 1)+ 2/2(2 + 1)+ 3/2(3 + 1)+ ....... + n / 2(n + 1)

这可以改写为

  

1/2(1 + 2 + ... + n)+ 1/2(1 + 4 + 9 + .... + n * n)

这反过来导致

  

n / 4(n + 1)+ 1/12(2n ^ 3 + 3n ^ 2 + n)

可以简化为

  

n ^ 3/6 + n ^ 2/2 + n / 3

忽略n的字长,评估此多项式的复杂度不依赖于n

因此,问题的时间复杂度为O(1)

所示算法的时间复杂度为O(n^2),如接受的答案中所述。