Я пытаюсь измерить сложность большой-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), так как это постоянно и ничего происходит, однако, цикл for, который звучит, хотя я с трудом пытаюсь распознать его ноту Big-O. Я предположил, что
for (int j=1; j<arr.length; j = j*2) {
if (arr[i] > arr[j])
sum += arr[i];
}
является линейной функцией O (п), потому что J может быть 1, но это происходит в линейной форме в O (2n), который является только O (п). Таким образом, не весь алгоритм был бы O (n^2)? Видимо, я не ответил на вопрос правильно на экзамене MOOC. Благодаря!
Я не знаю, как вы получили '2n'. Если что-то было 'n/2' (не то, что важно для Big-O) – 4castle
Конечно,' n/2' на самом деле для 'j = j + 2' – 4castle