我试图找到以下代码的复杂性,而且我不知道我是否正确使用了我的逻辑,如果我犯了错误,请纠正我
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?
如果我做得对,请告诉我,或者提出更好地了解循环逻辑的建议,谢谢。
答案 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不是整数除法,因为你为其他人指定了它,但不是这个。