Algorithm 如何计算此代码的时间复杂度?
如何计算以下算法的时间复杂度Algorithm 如何计算此代码的时间复杂度?,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,如何计算以下算法的时间复杂度 int x =0; for (int i = 1; i < n; i++) { for (int j = 1; j < n; ++j) { x++; n--; } } intx=0; 对于(int i=1;i1 考虑以下代码(上限): intx=0; 对于(;n>1;){ 对于(int j=1;j总的来说,复杂性是O(n) 我认为上限-下限方法的关键
int x =0;
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; ++j) {
x++;
n--;
}
}
intx=0;
对于(int i=1;i
我知道嵌套for循环的时间复杂度等于最内层循环的执行次数
就像外部循环从1到n的每个嵌套循环一样,它应该运行n次,但是这里我们有n--
,这使得算法运行的顺序更好。实际上,我在IDE中编写了这段代码,在循环结束后,我打印了x的最终结果,结果是不同的n值,我看到我们跳转到内部for循环需要将近n次的时间
所以我认为这个算法的整体顺序是O(n),但我不确定
谁能帮我彻底证明一下吗?你说得对
n
减少的总次数不能超过其原始值(i
和j
从不为负值)
因为对于内部循环的每个迭代,n
正好减少一次,这就为您提供了运行次数的上限,使您的代码O(n)
您还可以看到,这是一个严格的界限,因为第一次运行内部循环时,当
i>=n
时,它将停止,这将在~n/2
迭代后发生,同时给出ω(n)
的下限。如果您只希望时间复杂度为大O或大θ,让我们来计算上界和下界,这两种情况比较简单
考虑到内部for循环
,n
将在此时减少一半,或者n
将在每次退出内部for循环时变为n/2
(您已经知道了,对,因为j
一次增加1个单位,n
一次减少1个单位,所以j
和n
将在中间的n
或n/2
处相遇)当我们不知道代码何时停止时,事情就变得复杂了,n=?
,但我们知道n>1
考虑以下代码(上限):
intx=0;
对于(;n>1;){
对于(int j=1;j
n
每次迭代将变为n/2
,直到n=1
,因此obove代码的复杂性将为n/2+n/4+n/8+…+1=O(n)
下限更容易,假设内部for循环
只运行1次迭代,代码完成,1次迭代给我们提供了n/2
运算符。因此下限是O(n)
=>总的来说,复杂性是O(n)
我认为上限-下限方法的关键是在代码中省略一些复杂-难以计算-不清楚的变化变量
,并将其与原始变量进行比较为什么不简单地用不同的大小对其进行分析?如果你是对的,这将给你一个很好的指标。当你确定后,开始尝试证明它。
int x =0;
for (;n > 1;) {
for (int j = 1; j < n; ++j) {
x++;
n--;
}
}