2016-09-11 4 views
1

O (log N^3/M) 시간 복잡도로 알고리즘을 작성하려고합니다. 그러나 로그 N/M 부분에 대해서는 잘 모르겠습니다. 내 알고리즘이 올바른지 누군가가 확인해 주시면 고맙겠습니다. for (int i = 1; i < N; i += M)은 O (N/M)의 시간 복잡도를 가지며, O는 (N 로그) 상수를 곱한 것으로 i을 필요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 

*이면 결론은 O (N/M 로그) 경우에 달성 될 수 있다는 우리는 i에 상수를 추가하고 동시에 다른 상수로 그것을 곱하십시오.

O (N/log N) 시간 복잡도 알고리즘은 무엇이 될까요? 루프가 다음 우리가 가지고있는 케이 번 실행됩니다 말할 수 있기 때문에 for (int i = 1; i < N; i += M+i*2)는 O (로그 (N/M)) 가되지 않습니다 : :

+1

로그 (N^3/M) 또는 로그 (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

나는 생각 케이 *의 M + 2^K> = N -> 이는 k = 0 (log (N/M))으로 이어지지 않는다.

대신 당신은 쓸 수 :

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

이 분명 O (로그 (N/M))입니다.

+0

방정식은 ** k = O (log (N/M)) **가되어야하는 ** 3^k + M * 3^k = N **와 같아야합니다. 하지만 당신이 제안한 루프가 훨씬 낫다는 것에 동의합니다! –

+0

지적 해 주셔서 감사합니다 !! – coder

+0

'i + = i * 2'이 맞습니까? 'i = i * 2'가 아니겠습니까? – Stealth

관련 문제