复杂性计算和逻辑概念

时间:2015-07-15 00:43:42

标签: function time-complexity

我试图找到以下代码的复杂性,而且我不知道我是否正确使用了我的逻辑,如果我犯了错误,请纠正我

1)

For a = 1 to N
    j = v
    j = j / 2    
    k = i
    While k >= 1
        do some kind of processing
        k = k / 2     // integer division

2)

For i = 1 to N

        d = d / 2    // integer division
    k = i
    While k >= 1

        k = k-1

这个也应该是N * log N?

3)

For i = 1 to N                  functiontwo(x)
    call functiontwo(i)           if (x <= 0)
                                    return some value

这个也应该是n * log N,或者我错了,因为它调用了函数2,而函数2是log n?

如果我做得对,请告诉我,或者提出更好地了解循环逻辑的建议,谢谢。

1 个答案:

答案 0 :(得分:0)

(免责声明:我有一段时间没有这样做,但是由于还没有其他人跳过,我的两分钱希望总比没有好。)

我相信你的逻辑在#1上是合理的。 i循环应该是O(N),并且j和k循环看起来是O(logN),使得整体O(NlogN)。

我对#2的结论提出质疑。由于k递减1而不是除以,在我看来k循环将是O(N),整体上为O(N ^ 2)。

嗯......#3很奇怪。我明白为什么你的第一个想法是O(NlogN)。该部门通常会将其与#1相提并论。除了......发送到functiontwo的第一个参数将是来自i循环的正值。由于x> 0,然后它会用原始参数的一半调用functiontwo,这仍然是正数。这将再次发生,再一次,等等。我的数学家开始认为永远不会结束。但我想有人可能会争辩说,最终你会达到数值数据类型精度的极限,并最终使x / 2的结果接近零,计算机将其计为零。在这种情况下,我想O(NlogN)是准确的。

BTW,我对#3的回答是假设x / 2不是整数除法,因为你为其他人指定了它,但不是这个。