Ich habe ein wenig auf StackOverflow gesucht und die Komplexität bis zu dem Punkt der J-Schleife verstanden, die O(n2)
ist. Bei der verschachtelten Addition der k-Schleife bin ich jedoch verwirrt, warum die Komplexität O(n3)
wird. Kann mir jemand helfen, das zu verstehen?Was ist die Komplexität dieses verschachtelten Triple for Loop?
Aus meiner Sicht haben die i-Schleife n Iterationen und die J-Schleife haben 1 + 2 + 3 + ... + n Iterationen n*(n+1)/2
, die O(n2)
ist.
for(i = 1; i < n; i++) {
for(j = i+1; j <= n; j++) {
for(k = i; k <= j; k++) {
// Do something here...
}
}
}
EDIT: Vielen Dank für Ihre Hilfe Jungs :) Balthazar, ich habe ein Stück Code geschrieben, der Zähler zählt hoch, je nachdem, welche Schleife sie sind, irgendwie eine rohe Art und Weise von Schritt-für- Schritt:
#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;
}
lief ich diesen Code von n = 2 bis n = 9 mit Schritten von 1 und haben die folgende Sequenz erhielt:
Aus den Zählern ist daher ersichtlich: i = n-1, was die Komplexität von O (n) und j = ((n-1) * n)/2 ergibt, was die Komplexität O(n2)
ergibt. Ein Muster für K war schwer zu erkennen, aber es ist bekannt, dass K auf J abhängt, deshalb:
k = ((n+4)/3)*j = (n*(n-1)*(n+4))/6
gibt eine Komplexität von O(n3)
ich hoffe, diese Menschen in der Zukunft helfen wird.
EDIT2: Dank Dukeling für die Formatierung :) Auch einen Fehler in der letzten Zeile gefunden, korrigiert nun
Drei Schleifen können Komplexität größer als O (n^3) haben. – h8pathak