블로그

약수 개수 시간복잡도 계산 팁

게시 1분

 f(N) = N의 약수의 개수\ f\left(N\right)\ =\ N의\ 약수의\ 개수
for (int i=0; i<f(N); i++) for (int j=0; j<f(N); j++)
O(N2)O\left(\sqrt{N}^2\right)

이 알고리즘의 정확한 시간복잡도인지는 모르겠다.
하지만, O(root(N)^2) 보다 빠른 속도로 수행함은 보장할 수 있다.

이유를 생각해보자.
우선 약수의 개수를 구해보자.

N의 약수를 구할 때, 1부터 root(N)까지 나누면서,
N이 나눠진다면, 나누는 수와 그 몫을 저장하면 된다. (두 개씩 저장한다)

즉 약수의 개수는 항상 2 * root(N) 이하의 값을 가진다.
따라서 다음이 성립한다.

f(N) ≤ 2Nf\left(N\right)\ \le \ 2\sqrt{N}

이제 2*root(N)을 알고리즘에 대입한다면, 다음이 성립함을 알 수 있다.

O(2N⋅2N) = O(N2)O\left(2\sqrt{N}\cdot 2\sqrt{N}\right)\ =\ O\left(\sqrt{N}^2\right)

댓글

댓글을 남기면 닉네임(또는 GitHub 계정 정보)이 저장됩니다. 개인정보처리방침

GitHub