Ich habe einen Zählalgorithmus, für den ich versuche, eine allgemeine Big-O-Beschreibung zu erhalten. Es ist schrecklich verschachtelt und furchtbar exponentiell. Hier ist sie:Vereinfachung der Big-O-Komplexität dieses Exponentialalgorithmus
1. For each T_i in T
2. For k = 1 to max_k
3. For each of 2^k*(n choose k) items
4. For each t in T_i
5. check if the item is in t...etc.
Hier ist eine line-by-line Idee jeder Laufzeit
- Dies ist eine einfache Partitionierung und ich werde einfach eine Konstante c1 geben.
- max_k ist eine kleine Zahl, immer kleiner als n, vielleicht etwa 4 oder 5. Ich werde k unten verwenden.
- Diese Schleife läuft immer 2^k * (n wähle k) mal
- Indem wir Linie 1 konstant betrachten, können wir diese Linie verallgemeinern und wissen, dass sie im schlimmsten Fall nie mehr als 2^n Mal feuern wird Im Allgemeinen wird ein Bruchteil von 2^n Mal ausgeführt, also werden wir dies eine nennen (2^n)/c2
- Dies ist die einfache if-Anweisung in allen diesen Schleifen, also c3.
Multipliziert man alles zusammen ergibt:
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
Da ich eine Big-O-Darstellung wollen, gibt Konstanten ignoriert:
begrenzt istk * 2^k * (n choose k) * (2^n)
Es ist bekannt, dass (n wählen k) oben durch (n * e/k)^k, so:
O(k * 2^k * (n * e/k)^k * (2^n))
Meine Frage darauf ist, was kann ich hier ignorieren ... 2^n ist sicherlich der dominierende Begriff, da n immer größer als k ist, und typischerweise viel mehr. Kann dies zu O (2^n) vereinfacht werden? Oder O (2^schrecklich)? Oder sollte ich im 2^k wie in O (2^k * 2^n) gehen? (oder lassen Sie alle Begriffe drin?)
Mein Verständnis ist, dass, wenn k oder max_k kann konkurrieren oder übertreffen n, dann sind sie von entscheidender Bedeutung. Aber da sie immer beherrscht werden, können sie wie die Polynom-Laufzeiten niedrigerer Ordnung verworfen werden? Ich nehme an, dass die ganze exponentielle Laufzeit Verwirrung mich verwirrt. Jeder Rat wird sehr geschätzt.
+1 Starke Antwort ... – MoonKnight
Wenn es wahr ist, dass n immer größer als k ist, reicht das aus, um k zu begrenzen und es so zu entfernen? Ich denke, das ist es, was Sie sagen, aber ich will sicher sein. Ihr n * lg (k) Beispiel ist ziemlich klar - danke dafür. –
@Chucktown: "Wenn es wahr ist, dass n immer größer als k ist, reicht das aus, um k zu begrenzen und es so zu entfernen?" Nein. Wenn wir sagen "k ist begrenzt", meinen wir, dass es ein * CONSTANT * 'c' gibt so dass "k
amit