Time complexity 他们如何计算这个问题的时间复杂度

Time complexity 他们如何计算这个问题的时间复杂度,time-complexity,big-o,Time Complexity,Big O,问题6:找出以下程序的复杂性: void function(int n) {     int i = 1, s =1;     while (s <= n)     {         i++;         s += i;         printf("*");     } } void函数(int n) { int i=1,s=1; 而(snsok=O(√n) 上述函数的时间复杂度O(√n) 发件人: 一遍又一遍地看 显然,他们说时间复杂性是O(√n)

问题6:找出以下程序的复杂性:

void function(int n) 
{ 
    int i = 1, s =1; 
    while (s <= n) 
    { 
        i++; 
        s += i; 
        printf("*"); 
    } 
} 
void函数(int n)
{ 
int i=1,s=1;
而(snsok=O(√n) 

上述函数的时间复杂度O(√n)

发件人:

一遍又一遍地看


显然,他们说时间复杂性是O(√n) .我不明白他们是如何得出这个结果的,我已经试着反复研究这个问题。有人能把它分解成细节吗?

循环的开始,当
循环时,我们有
s=1;I=1
,而
n
是一些(大)数字。在循环的每一步中,都会执行以下操作:

  • 取当前的
    i
    ,并将其递增1
  • i
    的新值添加到
    s
    的总和中
  • 不难看出,
    i
    的连续更新形成了序列
    1,2,3,
    ,而
    s
    序列
    1,1+2,1+2+3,
    。通过,第一个
    k
    自然数
    1+2+3+…+k
    的和是
    k(k+1)/2
    。您应该认识到序列
    s
    符合此描述,其中
    k
    表示迭代次数


    while
    -循环在
    s>n
    时终止,这相当于找到最低迭代次数
    k
    ,从而
    (k(k+1)/2)>n
    。对于渐近情况,简化后的结果是
    k^2>n
    ,我们可以将
    k
    简化为
    k>sqrt(n)
    。因此,该算法在与
    sqrt(n)

    成比例的时间内运行。很明显,
    k
    是第一个整数,因此
    k(k+1)/2>n
    (否则循环会提前停止)


    然后
    k-1
    不能有相同的属性,这意味着
    (k-1)((k-1)+1)/2谢谢你的回答。我现在明白了。看起来我需要复习一些东西,忘记了高斯的公式。
    
    (k-1)k/2 <= n  →  (k-1)k  <= 2n
                   →  (k-1)^2 < 2n                    ; k-1 < k
                   →   k <= sqrt(2n) + 1              ; solve for k
                         <= sqrt(2n) + sqrt(2n)       ; 1 < sqrt(2n)
                          = 2sqrt(2)sqrt(n)
                          = O(sqrt(n))