如何解决有人可以评估此功能的时间复杂度
function (n)
input : an integer n
r ← 0
for i = 1 to n //runs n times
for j = i + 1 to n // runs n^2 times
for k = i + j − 1 to n //runs n^3 times
r ← r + 1
return r
我的回答是O(n ^ 3),但是当我尝试使用sigma表示法找到它时,它总是以O(n ^ 2)结尾。
原始问题:
以下算法返回什么值?它的基本操作是什么?怎么
基本操作执行了多少次?给出最坏情况下的运行时间
Big Oh表示法的算法。
解决方法
tldr:该算法位于O(n^3)
中。
为什么?
计算执行r <- r + 1
的频率。
如果有帮助,请以某种语言实施并执行,以使它感觉更好。例如,在Java中:
int n = 10;
int r = 0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
for (int k = i + j - 1; k <= n; k++) {
r++;
}
}
}
简介
外部循环正确生成n
个迭代。然后,第二个循环将生成n - 1,n - 2,n - 3,n - 4,...
个世代。
最里面的循环取决于i
,j
和n
。
例如,修复i = 1
,然后让j
从n - 1
运行到1
。您将获得k
1 + (n - 1)
到n
,这根本没有运行。然后运行1 + (n - 2)
的{{1}}至n
,最多运行2
。
因此,使用n
,您将获得i = 1
。然后k = 2,3,4,...,n
,您得到i = 2
。重复并求和,直到k = 4,n + (n + 1)
总共只产生i = n
:
k = (n+(n-2))
对于带有i = 1 -> k = 2,5,6,n
i = 2 -> k = 4,n,(n+1)
i = 3 -> k = 6,(n+1),(n+2)
.
.
.
i = n -> k = (n+(n-2))
的示例,它是:
n = 10
2,7,8,9,10
4,10,11
6,11,12
8,12,13
10,13,14
12,14,15
14,15,16
16,17
18
。
k
的值
现在请注意,循环只会执行到k
为止。因此,您可以舍弃高于k <= n
的{{1}}的所有值,并计算剩余值的迭代次数。
k
总跑步次数
因此,每个参数都是n
的值,它将产生2,10|
4,10|,13
10|,14
| 12,15
| 14,16
| 16,17
| 18
多次运行。这样做,您会得到:
k
对这些求和求和,您最终获得了总运行次数:
(n + 1) - k
哪个产生9,2,1
7,1
5,1
3,1
1
。
公式和证明
确切的公式是:
9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
+ 7 + 6 + 5 + 4 + 3 + 2 + 1
+ 5 + 4 + 3 + 2 + 1
+ 3 + 2 + 1
+ 1
如果您放下r = 95
(不会影响复杂性),则可以简化为
sum_{i = 1}^{n - 1} ceil((n - i) / 2) * i
现在您可以轻松地看到并证明它在ceil
中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。