我只是从算法开始,我正尝试在下面的while循环中以'n'表示运行时间。
int k=1;
while(k<n-k){
k+=k;
}
这里n> 2。我知道k的值每次都会翻倍,并且一旦k值大于n / 2时,循环只会运行一次。但是我很难用“ n”来表示。
答案 0 :(得分:3)
有必要列出要点:
kubectl top node/pod
在每次循环迭代中加倍
您的循环条件可以重写为:k
*
基本问题是:我必须对while(2*k < n)
进行加倍,直到 k
加倍等于多少次?大于k
?
这很容易。这正是对数的工作方式。以数字n
为例。我必须翻倍才能达到1000次?答案是将log 2 1000向上舍入。
本质上,您的算法是2
,这意味着您的算法以对数时间复杂度运行。
*正如FrançoisAndrieux 在他的评论中正确指出的那样,尽管从数学上讲这是正确的,但由于数据类型的表示限制,在编程中并非总是如此。对于较大的log_2(n) - 1
,表达式k
可能会导致溢出并使整个表达式无效,而对于相同的输入,表达式2*k
会正确运行。
答案 1 :(得分:1)
替换
while(k<n-k)
k+=k;
等价
while(2*k<n)
k*=2
最后一个绝对是O(log(n))
-它执行了log2(n)-1
个步骤
答案 2 :(得分:1)
表达式compose
简化为k < n-k
。
时间复杂度应为k < n/2
,以2为基数
O(log(n))