Ho cercato un po 'su StackOverflow e ho capito la complessità fino al punto del j-loop, che è O(n2)
. Tuttavia con l'aggiunta annidata del k-loop, sono confuso dal motivo per cui la complessità diventa O(n3)
. Qualcuno può aiutarmi a capire questo?Qual è la complessità di questo ciclo triplo annidato?
Dalla mia comprensione, l'i-loop ha n iterazioni e il j-loop ha 1 + 2 + 3 + ... + n iterazioni n*(n+1)/2
che è O(n2)
.
for(i = 1; i < n; i++) {
for(j = i+1; j <= n; j++) {
for(k = i; k <= j; k++) {
// Do something here...
}
}
}
EDIT: Grazie per il vostro aiuto ragazzi :) Balthazar, ho scritto un pezzo di codice al quale incrementerà i contatori a seconda di quale circuito in cui si trovano, un po 'un modo rozzo di per passo passo:
#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;
}
ho eseguito questo codice da n = 2 per n = 9 con incrementi di 1 e hanno ottenuto la seguente sequenza:
Dai contatori, si può quindi vedere che: i = n-1 dando la complessità di O (n) e j = ((n-1) * n)/2 dando la complessità O(n2)
. Un modello per la K era difficile da individuare, ma si sa che K dipende J, quindi:
k = ((n+4)/3)*j = (n*(n-1)*(n+4))/6
dando una complessità di O(n3)
Spero che questo aiuterà le persone in futuro.
EDIT2: grazie Dukeling per la formattazione :) Trovato anche un errore nell'ultima riga, corretti ora
Tre loop possono avere una complessità superiore a O (n^3). – h8pathak