#javascript #algorithm #big-o
#javascript #алгоритм #big-o
Вопрос:
Я понимаю, что
var arr; // This is an array of arrays
for (i = 0; i < arr.length; i )
{
for(j = 0; j < arr[i].length; j )
{
// Some code
}
}
равно n ^ 2, однако мой приведенный ниже код представляет собой двойной вложенный цикл for, и мне просто любопытно, как будет выглядеть сложность для этого типа функции
var arr; // This is an array of arrays
for (i = 0; i < arr.length; i )
{
for(j = 0; j < arr[i].length; j )
{
// Some code
}
for(k = 0; k < arr[i].length; k )
{
// Some code
}
}
Комментарии:
1. Это то же самое. Вы только что умножили на постоянный коэффициент, и это никак не влияет на сложность.
2. Сложность все та же, но ваша аналогия с n ^ 2 верна, если все столбцы имеют ту же длину, что и строки, иначе сложность равна rows * columns
3. Если вы выполните поиск по фразе «Как вычислить временную сложность алгоритма», вы найдете ресурсы, которые могут объяснить это намного лучше, чем мы можем в ответе здесь.
Ответ №1:
Сложность последовательных фрагментов кода — это максимальная сложность каждого из них. Итак, если у вас есть два последовательных цикла, и они оба O(n)
, то сложность обоих вместе также O(n)
.
Поскольку эти два цикла вложены внутри O(n)
цикла, сложность всего этого O(n^2)
. Точно так же, как сложность исходного кода.
Ответ №2:
Цикл имеет сложность O(n * content)
, блок инструкции имеет сложность всех его членов, суммированных O(n1 n2 ...)
. Теперь в вашем случае это
// v outer loop
// v inner loop 1
// v inner loop 2
O(n * ((n * 1) (n * 1)))
= O(n * (n n))
= O(n * 2n) // constants can be ignored
= O(n * n)
= O(n²)