私は StackOverflow で少し検索し、j ループのポイントまでの複雑さを理解しました。ただし、k ループのネストされた追加により、なぜ複雑になるのか混乱しています。誰かがこれを理解するのを手伝ってくれますか?O(n2)
O(n3)
私の理解では、i ループには n 回の反復があり、j ループには 1+2+3+...+n 回の反復n*(n+1)/2
があります。O(n2)
for(i = 1; i < n; i++) {
for(j = i+1; j <= n; j++) {
for(k = i; k <= j; k++) {
// Do something here...
}
}
}
編集:助けてくれてありがとう:) バルタザール、どのループにいるかに応じてカウンターをインクリメントするコードを書きました。
#include <iostream>
int main(int argc, const char * argv[])
{
int n = 9;
int index_I = 0;
int index_J = 0;
int index_K = 0;
for (int i = 1; i < n; i++) {
for (int j = i+1; j <= n; j++) {
for (int k = i; k <= j; k++) {
index_K++;
}
index_J++;
}
index_I++;
}
std::cout << index_I << std::endl;
std::cout << index_J << std::endl;
std::cout << index_K << std::endl;
return 0;
}
このコードを n=2 から n=9 まで 1 ずつ増やして実行したところ、次のシーケンスが得られました。
したがって、カウンタから次のことがわかります。 i = n-1 は O(n) の複雑さを示し、j = ((n-1)*n)/2 は複雑さを示します。K のパターンを見つけるのは困難でしたが、K が J に依存することが知られているため、次のようになります。O(n2)
k = ((n+4)/3)*j = (n*(n-1)*(n+4))/6
の複雑さを与えるO(n3)
これが将来人々に役立つことを願っています。
EDIT2: 書式設定についてDukelingに感謝します:) また、最後の行に間違いが見つかりました。現在修正されています。