私は次のアルゴリズムのビッグOの複雑さを測定しようとしています:このアルゴリズムの時間複雑度(Big-O)を測定するにはどうすればよいですか?
int sumSome(int[] arr){
int sum = 0;
for (int i=0; i<arr.length; i++) {
for (int j=1; j<arr.length; j = j*2) {
if (arr[i] > arr[j])
sum += arr[i];
}
}
return sum;
}
今、私の理解から、それは定数と何なので
if (arr[i] > arr[j])
sum += arr[i];
がOの大きなO(1)を持っていますしかし、私はBig-O表記法を見分けるのに苦労しているが、それを聞こえるforループは起こっている。私は
for (int j=1; j<arr.length; j = j*2) {
if (arr[i] > arr[j])
sum += arr[i];
}
は、一次関数Oであると仮定(n)のjは多分1理由はそれだけではO(n)であるO(2N)で直線状に上がっています。だからアルゴリズム全体がO(n^2)ではないでしょうか?明らかに私はMOOC試験で質問に正しく答えなかった。ありがとう!
は、私はあなたが '2n'を得たかどうかはわかりません。もし何かあれば 'n/2'となるでしょう(Big-Oには関係ありません) – 4castle
もちろん、' n/2'は実際に 'j = j + 2'です。 – 4castle