int i=1,s=1;
while(s<=n)
{
i++;
s=s+i;
}
これの時間計算量は O(root(n)) です。私はそれを理解していません。シリーズは 1+2+...+k のようになるためです。助けてください。
int i=1,s=1;
while(s<=n)
{
i++;
s=s+i;
}
これの時間計算量は O(root(n)) です。私はそれを理解していません。シリーズは 1+2+...+k のようになるためです。助けてください。
ループを実行させますx
。s
これで、が 未満である限り、ループが実行されn
ます。
我々は持っています :
1回目の反復
s = s + 1
後: 2回目の反復後:
s = s + 1 + 2
x回の反復が続くと、最終的には次のようになります
1 + 2 ... + x <= n
=>(x * (x + 1)) / 2 <= n
=> O(x^2)
<= n
=> x= O (root(n))
s(k) = 1 + 2 + 3 + ... k = (k + 1) * k / 2
s(k) >= n
少なくともkステップが必要です。n = (k + 1) * k / 2
、したがってk = -1/2 +- sqrt(1 + 4 * n)/2
;
定数と係数を無視し、O(-1/2 + sqrt(1+4n)/2) = O(sqrt(n))
これは合計を計算し、s(k)=1+2+...+k
で停止しs(k) > n
ます。
であるため、 がを超えるs(k)=k*(k+1)/2
ために必要な反復回数は です。s(k)
n
O(sqrt(n))