我试图回答一些我遇到过的问题。我一直在观看有关算法运行时间的一些视频。根据我的理解,你必须在迭代中计算每个操作以获得运行时间。
我有以下问题,我不太明白。选择的常数让我失望。任何人都可以试着解释一下吗?
以下代码的运行时间是多少? (A是数组大小N,“B”,“C”,“D”是选择中的常量)
1. for j ← 2 to length(A)
2. key ← A[ j ]
3. //Insert A[ j ] is added in the sorted sequence A[1,..j-1]
4. i ← j - 1
5. while i >= 0 and A [ i ] > key
6. A[ i +1 ] ← A[ i ]
7. i ← i -1
8. A [i +1] ← key
答案选项是:
A)B * n + C + D
B)B * n * log n + C * log n + D
C)B * log n + C + D
D) B * n^2 + C * n + D
对我而言,重要的不是答案,而是如何实际应对。谢谢。
答案 0 :(得分:0)
这看起来好像在最坏的情况下它是O(n ^ 2),这是选项(D)。
你的外部循环遍历数组的长度,所以外部循环经过n次。 (它实际上是n-1,但在这种类型的计算中你可以忽略它。)
然后(步骤5)你有一个内循环。 (我假设这个循环在第7步或第8步之后结束,虽然它不太清楚。)这个内部循环也可以运行多达n次迭代。
然后,你有一个O(n)循环在另一个O(n)循环内运行;或大约n次迭代乘以n次迭代。这给你O(n ^ 2)。常数因素并不重要:它需要花费一些时间来进行n ^ 2次操作,加上一些我们不关心的其他小东西。这就是选项(D)所说的。
顺便说一下,目前尚不清楚步骤3的作用。这可能会被注释掉,或者可能表示此处正在插入数组。但这并不重要:但是插入正在发生,它不会超过O(n)步骤。它在内部循环之外,因此外部循环仍然具有O(n)次迭代,并且其中的内容仍然在O(n)时间内运行。总数仍为O(n ^ 2)。