for(int i = n; i > 0; i--) {
for(int j = 1; j < n; j *= 2) {
for(int k = 0; k < j; k++) {
... // constant number C of operations
}
}
}
для этого кода N = 2^m, а правильный ответ - O (N^2). мой профессор сказал, что средняя и внутренняя петли зависят друг от друга, поэтому средняя петля и внутренний петля образуют ряд 2^0 + 2^1 + 2^2 + ... + 2 (log (N)), сумма этого ряда равна 2N. Таким образом, две внутренние петли вместе образуют 2N. 2N * n^2 = O (n^2). Кто-то, пожалуйста, объясните мне эту часть, как мой профессор получил ответ 2N? потому что я думал, что это будет Log N * N для внутренних и средних циклов.Кто-то помогает объяснить большую сложность этого кода Java, я так запутался
но с моей точки зрения, не я просто беру большой О для каждого цикла, начиная с внешнего, N * log N * n = n^2 * log N. Почему мой путь неправильный? и как узнать, когда плюсом или умножить.
так что вы говорите последние две последние петли связаны вместе, поэтому я не должен смотреть на них как log n и n, но вместо этого O (n) –
да, последний цикл зависит от 'j', который меняется во втором цикле, вы не можете умножать итерации, потому что количество итераций не является константой, вы должны суммировать последние итерации цикла на каждую итерацию второго цикла. – Ahmad