Time complexity 用C语言计算特定代码的时间复杂度

Time complexity 用C语言计算特定代码的时间复杂度,time-complexity,Time Complexity,考虑C中的以下代码: int i = 1; while(i < n) { if((n – i) % 2) i *= 3; else i *= 2; } inti=1; 而(i=n时,循环结束。 3^x>=n x>=log3(n)。在最坏的情况下,它可能是log3(n),在最好的情况下,它可能是log2(n) 不过,基数的变化将是一个常数。所以它是O(lg n),因为常数不重要,我们知道它介于这两种情况之间。你目前认为时间复杂性是什么,为什么

考虑
C
中的以下代码:

int i = 1;
while(i < n)
{
    if((n – i) % 2)
        i *= 3;
    else
        i *= 2;
}
inti=1;
而(i

这是一个更大的代码的一部分。我试图计算这段代码的时间复杂度。我应该如何从数学角度来处理它?我知道如何计算线性循环,但每次我必须面对非线性循环(代码中的跳跃),我就会遇到麻烦

好吧,如果你在寻找时间复杂度,你可以模拟不同值的算法

就你而言: 假设n是奇数。 然后在第一次迭代中,我将加倍。然而,下一次(n-i)将是奇数,无论你将i乘以什么,它都不会改变(我将始终是偶数,所以(n-i)将是奇数)。所以每下一次迭代,我将乘以3。可以说,在这种情况下,算法的时间复杂度为O(log3n)

如果n是偶数呢? 然后在第一次互动中,我将三倍。我们可以很容易地看到,为了(n-i)平衡,我必须平衡。它永远不会变平,因为你永远不会把它乘以2。时间复杂度也是O(log3 n)

无论如何,在这个算法中,您的时间复杂度是O(log3n)。如果根据输入存在多个可能的时间复杂度,则必须精确计算实际要计算的时间复杂度。通常情况下,这是最糟糕的时间复杂度,所以你要从可能的复杂度中选择最糟糕的

编辑:一些澄清: 1) 为什么要检查n是偶数还是奇数?在您的算法中,改变算法工作方式的是以下代码:“if((n-i)%2)”它检查(n-i)是偶数还是奇数。不能为i取其他值,因为它在开始时设置为1。所以我能检查的唯一变量是n。我不关心n实际上是什么,我只需要知道((n-I)%2)的结果是什么,所以我需要知道n是否可以被2整除

2) 如果我每次都被乘以3,为什么复杂性是O(log3n)? 每次你的循环激活时,我都被乘以3。在100步之后,我将乘以3^100。当i大于或等于n时,循环结束,当1*3^x>=n时,循环结束。 3^x>=n x>=log3(n)。

在最坏的情况下,它可能是
log3(n)
,在最好的情况下,它可能是
log2(n)


不过,基数的变化将是一个常数。所以它是O(lg n),因为常数不重要,我们知道它介于这两种情况之间。

你目前认为时间复杂性是什么,为什么?问问你自己,如果我把“n”翻一番,这个代码需要多长时间。如果您不确定,请插入“n”值的值1、2和4,并计算每个值使用的操作数。回答得很好。很遗憾,它以前没有被投票,甚至一次也没有。太棒了!