2016-09-11 5 views
1

Я пытаюсь написать алгоритм с временной сложностью O (log N^3/M). Однако я не уверен в части журнала N/M. Я был бы признателен, если бы кто-нибудь мог подтвердить, правильно ли мой алгоритм.Алгоритм с временной сложностью O (log N^3/M)

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 

* Если for (int i = 1; i < N; i += M) имеет O (N/M) временную сложность, и О (журнал N) требует i следует умножить на константу, то можно сделать вывод, что О (Log N/M) может быть достигнуто, если мы добавляем константу в i и умножаем ее на другую константу одновременно.

Каким будет алгоритм для временной сложности O (N/log N)?

+1

Вы имеете в виду log (N^3/M) или log (N^3)/M? – coincoin

+0

Последняя часть вашего вопроса [ответ на этот вопрос] (http://stackoverflow.com/questions/35176736/algorithms-with-on-logn-complexity/39215822#39215822). – templatetypedef

+0

O (log (N^3/M)) будет правильным. – Stealth

ответ

1

Я думаю, что: for (int i = 1; i < N; i += M+i*2) не O (журнал (N/M)) потому, что позволяет говорить о том, что цикл будет выполняться в к раз, то мы имеем: к * М + 2^к> = N -> что не приводит к k = O (log (N/M)).

Вместо этого вы могли бы написать:

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

это, очевидно, O (журнал (N/M)).

+0

Уравнение должно быть чем-то вроде ** 3^k + M * 3^k = N **, которое должно приводить к ** k = O (log (N/M)) **. Но я согласен, что цикл, который вы предложили, намного лучше! –

+0

Спасибо за указание! – coder

+0

Вы уверены, что 'i + = i * 2' верны? Разве это не должно быть 'i = i * 2'? – Stealth

Смежные вопросы