如何找到产生系列求和的以下算法的复杂性。
系列: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
答案 0 :(得分:0)
要查找时间复杂度,请分析核心(在循环内)运行的次数。
外部循环运行n次,因此复杂度至少 O(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)
,如接受的答案中所述。