C++ 计算while循环的运行时间

C++ 计算while循环的运行时间,c++,algorithm,time-complexity,C++,Algorithm,Time Complexity,我只是从算法开始,我试图找出下面while循环的运行时间,以“n”为单位 int k=1; while(k<n-k){ k+=k; } intk=1; 虽然(k2)。我知道k的值每次翻倍,循环只运行一次,一旦k值大于n/2。但我很难用“n”来表示相同的值。 while(k<n-k) k+=k; while(kReplace while(k<n-k) k+=k; while(k值得列出要点: k在每次循环迭代中加倍 循环条件可以重写为:whil

我只是从算法开始,我试图找出下面while循环的运行时间,以“n”为单位

int k=1;
while(k<n-k){
k+=k;
}
intk=1;
虽然(k2)。我知道k的值每次翻倍,循环只运行一次,一旦k值大于n/2。但我很难用“n”来表示相同的值。

  while(k<n-k)
     k+=k;
while(kReplace

  while(k<n-k)
     k+=k;

while(k值得列出要点:

  • k
    在每次循环迭代中加倍

  • 循环条件可以重写为:
    while(2*k
    *

基本问题是:我必须将
k
加倍多少次,直到
k
加倍的次数等于或大于
n

这相当简单。这正是对数的工作原理。以数字
2
为例。要达到1000,我需要加倍多少次?答案是log21000四舍五入

本质上,您的算法是
log_2(n)-1
,这意味着您的算法以对数时间复杂度运行


*正如弗朗索瓦·安德烈(François Andrieux)在他的评论中正确地指出的那样,虽然从数学上讲这句话是正确的,但由于数据类型的表示限制,在编程中并不总是如此。对于大的
k
s,表达式
2*k
可能会导致溢出并使整个表达式无效,而使用相同的输入表达式
k
将正确运行。
值得列出以下要点:

  • k
    在每次循环迭代中加倍

  • 循环条件可以重写为:
    while(2*k
    *

基本问题是:我必须将
k
加倍多少次,直到
k
加倍的次数等于或大于
n

这相当简单。这正是对数的工作原理。以数字
2
为例。要达到1000,我需要加倍多少次?答案是log21000四舍五入

本质上,您的算法是
log_2(n)-1
,这意味着您的算法以对数时间复杂度运行


*正如弗朗索瓦·安德烈(François Andrieux)在他的评论中正确地指出的那样,虽然从数学上讲这句话是正确的,但由于数据类型的表示限制,在编程中并不总是如此。对于大的
k
s,表达式
2*k
可能会导致溢出并使整个表达式无效,而使用相同的输入表达式
k
将正确运行。
表达式
k
简化为
k

时间复杂度应为
O(log(n))
,基数为2

K = 1 -> 2 -> 4 -> 8 -> ... -> m iterations

2^(m-1) < n/2

m-1 < log2(n/2)

m ~ log2(n)
K=1->2->4->8->…->m次迭代
2^(m-1)
表达式
k
简化为
k

时间复杂度应为
O(log(n))
,基数为2

K = 1 -> 2 -> 4 -> 8 -> ... -> m iterations

2^(m-1) < n/2

m-1 < log2(n/2)

m ~ log2(n)
K=1->2->4->8->…->m次迭代
2^(m-1)
虽然它不会改变答案的正确性,但我想指出,由于
k
是一个
signed int
2*k
并不完全等同于
k
,因为如果
n
足够大,第一个表单可能会溢出。这是一个应该解决的非常有效的问题。我将添加此命令我很快回答。谢谢。虽然这不会改变答案的正确性,但我想指出,由于
k
是一个
带符号的int
2*k
并不完全等同于
k
,因为如果
n
足够大,第一个表单可能会溢出。这是一个非常有效的点,应该添加我很快会在我的回答中添加此评论。谢谢