2016-09-11 4 views
1

Ich versuche, einen Algorithmus mit O (log N^3/M) Zeit Komplexität zu schreiben. Ich bin mir jedoch nicht sicher über log N/M Teil. Ich wäre dankbar, wenn jemand bestätigen könnte, ob mein Algorithmus korrekt ist.Algorithmus mit O (log N^3/M) Zeit Komplexität

for (int i = 1; i < N; i = i*2) // log N 
    for (int i = 1; i < N; i = i*2) // log N 
    *for (int i = 1; i < N; i += M+i*2) // log N/M 

* If for (int i = 1; i < N; i += M) O (N/M) Zeitkomplexität aufweist und O (log N) erfordert i mit einer Konstanten multipliziert werden, dann ist die Schlussfolgerung, dass O (log N/M) erreicht werden kann, wenn wir fügen die Konstante zu i hinzu und multiplizieren sie gleichzeitig mit einer anderen Konstante.

Was wäre ein Algorithmus für O (N/log N) Zeitkomplexität?

+1

Meinst du log (N^3/M) oder log (N^3)/M? – coincoin

+0

Der letzte Teil Ihrer Frage [wird hier beantwortet] (http://stackoverflow.com/questions/35176736/algorithms-with-on-logn-complexity/39215822#39215822). – templatetypedef

+0

O (log (N^3/M)) wäre korrekt. – Stealth

Antwort

1

Ich denke, dass: for (int i = 1; i < N; i += M+i*2) nicht O (log (N/M)) da können sagen, dass die Schleife für k mal ausgeführt wird, dann haben wir: k * M + 2^k> = N -> was nicht zu k = O führt (log (N/M)).

Stattdessen könnten Sie schreiben:

for (int i = 1; i < N/M; i =i*2) 

dies offensichtlich O (log (N/M)).

+0

Die Gleichung sollte etwas wie ** 3^k + M * 3^k = N ** sein, was zu ** k = O (log (N/M)) ** führen sollte. Aber ich stimme zu, dass die von Ihnen vorgeschlagene Schleife viel besser ist! –

+0

Danke, dass du das gezeigt hast !! – coder

+0

Sind Sie sicher, dass "i + = i * 2" korrekt ist? Sollte es nicht "i = i * 2" sein? – Stealth

Verwandte Themen