์๊ณ ๋ฆฌ์ฆ ํจ์จ์ฑ ์ฒดํฌ์์ ์ฐ์ด๋ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋, ๊ทธ๋ฆฌ๊ณ Big-O ํ๊ธฐ๋ฒ์ ๋ํด ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๊ณ ์ ํ๋ค.
์ฝํ ์์ ์ด๋์ ๋ ๊ตฌํ์ ํ๋ค๋ณด๋ฉด ์๊ฐ ์ด๊ณผ ํน์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ฅผ ๊ฒช๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ ๋ ์ด๋ค ๊ณณ์ ์ต์ ํํ๋ฉด ์ข์์ง ์๊ณ ์ ๊ฒธ์ฌ๊ฒธ์ฌ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๊ธฐ๋ก ํ๋ค.
์ ๋์ ๋ชจ๋ฅผ ๋์ ์ฝ๋ ๊ตฌํ์ ์ ๋ง ๋ฌ๋ผ์ง ๊ฒ์ด๋ค.
๐ ๋ณต์ก๋ & ์ ๊ทผ์ ํ๊ธฐ๋ฒ
๋ณต์ก๋, ๊ทธ๊ฒ์ด ๋ฌด์์ธ๊ฐ ๐ง
์ปดํจํฐ ๊ณผํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ์ฐ ๋ณต์ก๋(Computational Complexity) ํน์ ๋ณต์ก๋(Complexity)๋ผ๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ๋ฐ ํ์ํ ์์์ ์์ ๋ปํ๋ค.
์ด๋ ๊ณณ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ , ๋ณต์ก๋๊ฐ ์์ผ๋ฉด ์์ ์๋ก ํด๋น ์๊ณ ๋ฆฌ์ฆ์ด ํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ๋ค.
์ฌ๋ฌ ๋ณต์ก๋๊ฐ ์์ง๋ง ๋ํ์ ์ธ ๋ณต์ก๋์๋ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ์๋ค. (๋ถ์ฐ์๋ ํต์ ๋ณต์ก๋๋ ์ฐ์ธ๋ค๊ณ ํ๋ค)
๊ทธ๋ผ ์ด ๋ณต์ก๋๋ฅผ ํ๊ธฐํ๊ธฐ ์ํ ๊ฒ์ด ํ์ํ๋ค.
โ ์ ๊ทผ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณต์ก๋๋ฅผ ๋ํ๋ธ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํ์ ํ๊ธฐ๋ฒ์ด๋ค.
์ ๊ทผ์ ํ๊ธฐ๋ฒ์ ์ฃผ์ด์ง ํจ์์ ์ฆ๊ฐ ์์์ ๋ค๋ฅธ ํจ์์์ ๋น๊ต๋ก ํํํ๋ ์๋ก ๊ณผ ํด์ํ์ ๋ฐฉ๋ฒ์ด๋ค- ๋ผ๊ณ ์ํค๊ฐ ๋งํ๋ค.
๋์ฒด ์ด๊ฒ ๋ญ๋ง์ด์ผ? ์ถ์ด์ ๋ ์ฐพ์๋ณด์๋ค.
๐ก ์ ๊ทผ์ ๋ถ์ ์ดํด๋ฅผ ์ํ ์์ ( multiply )
int[] multiply(int[] inputs, int multiplier) {
int[] nums = new int[inputs.length];
for (int i = 0 ; i < inputs.length ; i++) {
nums[i] = inputs[i] * multiplier;
}
return nums;
}
์คํ ์๊ฐ์ ๊ฐ ์ฝ๋์ ์ํ ๋จ๊ณ๋ณ๋ก ์์(๊ณ ์ ์ ์ธ ์)๋ผ๊ณ ๊ฐ์ ํ๋ค.
์์ ์์ ๋ ์ด 4๋จ๊ณ์ ์ํ ๋จ๊ณ๊ฐ ์๋ ๊ฒ์ด๋ค. nums ๋ฐฐ์ด ์์ฑ, ๋ฐ๋ณต๋ฌธ, ์ฐ์ฐ, ๋ฐํ
1๏ธโฃ ์คํ ์๊ฐ์ ๋ํ๋ด๋ ํจ์ T(N) ๊ตฌํ๊ธฐ
์ํ ๋จ๊ณ | ํ์ |
c1 | 1 |
c2 | N+1 |
c3 | N |
c4 | 1 |
c1 : nums์ ๋ฐฐ์ด ์์ฑ์ 1ํ์ด๋ฏ๋ก 1
c2: input์ ๊ธธ์ด ๋งํผ ๋ฐ๋ณต(N)ํ๊ณ , ๋ฃจํ ๋น ์ ธ๋์ฌ๋ ํ๋ฒ ๋ ์กฐ๊ฑด ๊ฒ์ฌ(1)
c3: input์ ๊ธธ์ด ๋งํผ ๋ฐ๋ณต(N)
c4: ๋ฐํ์ 1ํ์ด๋ฏ๋ก 1
๋ฐ๋ผ์ T(N)์ ๊ณ์ฐํ๋ ์์์ ์ ๋ฆฌํ๋ฉด,
T(N) = c1 + c2*(N+1) + c3*N + 1
= (c2 + c3)*N + (c1 + c2 + 1)
= a*N + b
์ด๋ ๊ฒ ์ ๋ฆฌ๋๋ค.
2๏ธโฃ ๋ฐ๋ณต ํ์๊ฐ ๋ฌดํ๋๋ก ๋์ด๋๋ค๋ฉด? N → ∞
N์ด ์์ ๋ ํจ์จ์ฑ ์ธก์ ์ด ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก(์ด์ฐจํผ ๋นจ๋ฆฌ ๋๋๋๊น) ๋ฌดํ๋๋ผ๊ณ ๊ฐ์ ์ ํด๋ณด๋ ๊ฒ์ด๋ค.
์ด ๋, ์๋์ ์ผ๋ก ๋ ์ค์ํ ์ ๋ณด๋ ๋นผ๋ฒ๋ฆฐ๋ค → ์ต๊ณ ์ฐจํญ(N์ด ๊ณฑํด์ง ๊ฒ ์ค์ ์ ์ผ ์๊ฐ ํฐ๊ฒ)๋ง ๋จ๊ธฐ๊ณ ๋บ๋ค
์ต๊ณ ์ฐจํญ์ ์ ์ธํ๋ฉด ๋ฌดํ๋๋ก ๊ฐ์๋ก ๊ทธ ์ํฅ๋ ฅ์ด ์์์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์์ํญ์ธ b๋ฅผ ์ ๊ฑฐํ๋ค. ๊ฐ์ ์ด์ ๋ก ์ต๊ณ ์ฐจํญ์ ๊ณ์์ธ a๋ ์ ๊ฑฐํ๋ค.
๊ทธ๋ผ N๋ง ๋จ๋๋ค. ์ด๊ฑธ ํ๊ธฐํ ๊ฒ์ด ๐น(N) ๋น ์ธํ N์ด๋ค.
๐๐ป ๊ฒฐ๋ก : ์ด๋ ๊ฒ N์ด ๋ฌดํ์ผ๋ก ๊ฐ๋ ํจ์ T(N)์ด ์ด๋ค ํํ์ ํจ์๋ก ๊ทผ์ฌํ๊ฒ ๋๋์ง๋ฅผ ๋ถ์ํ๋ ๋ฐฉ์์ด ๋ฐ๋ก ์ ๊ทผ์ ๋ถ์์ด๋ค.
๐ก ์ ๊ทผ์ ํ๊ธฐ๋ฒ ์ดํด๋ฅผ ์ํ ์์ ( exits )
์ ๊ทผ์ ํ๊ธฐ๋ฒ์๋ ์ํ,ํํ,ํ๊ท ๋ญ์๊ธฐ๊ฐ ์๋๋ฐ ์ด๊ฒ ์ด๋ป๊ฒ ๋์ค๊ฒ ๋๊ฑด์ง ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
boolean exists(int[] inputs, int target) {
for (int i = 0 ; i < inputs.length ; i++) {
if (inputs[i] == target) {
return true;
}
}
return false;
}
์ด ์์ ๋ ์ด๋ค ํ ๋ฐฐ์ด์์ ์ฐพ๊ณ ์ ํ๋ ์๊ฐ ์์ผ๋ฉด true, ์๋๋ฉด false๋ฅผ ๋ฐํํ๋ค.
์์ ์์ ์ ๋ค๋ฅธ ์ ์ target์ด ๋ฐฐ์ด์ ์ด๋ ์์น์ ์๋๋์ ๋ฐ๋ผ ์คํ ์๊ฐ์ด ์ฐจ์ด๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค.
target์ด ์์ ์๋ค๋ฉด ์ผ์ฐ ๋๋ ํ ์ง๋ง, ๋ค์ ์๋ค๋ฉด ๋ฆ๊ฒ ๋๋ ๊ฒ์ด๋ค.
1๏ธโฃ ์ต์ ๊ณผ ์ต์ ์ ์ํฉ์ผ๋ก ๊ตฌ๋ถํ๋ค.
Best case์ Worst case๋ก ๋๋์ด ์คํ ์๊ฐ์ ํ์ธํด๋ณธ๋ค.
Case | target ์์น | ํ์ |
Best | 0๋ฒ์งธ ์์น | 1 |
Worst | ๋ง์ง๋ง ์์น or ์กด์ฌํ์ง ์์ | N |
2๏ธโฃ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค๋ช ํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ
- ํํ์ (lower bound)์ ๊ธฐ์ค์ผ๋ก ์ค๋ช : ํจ์ ์คํ ์๊ฐ์ ์๋ฌด๋ฆฌ ๋นจ๋ผ๋ ์์ ์๊ฐ(1) ์ด์์ด๋ค. → ๐ฎ(1)
- ์ํ์ (upper bound)์ ๊ธฐ์ค์ผ๋ก ์ค๋ช : ํจ์ ์คํ ์๊ฐ์ ์๋ฌด๋ฆฌ ์ค๋ ๊ฑธ๋ ค๋ N์ ๋น๋กํ๋ ์ ๋ ์ดํ์ด๋ค. → O(N)
๐๐ป ๊ฒฐ๋ก : ๐ฎ(1) , O(N) ๋๋ค ๋ง๋ ์ค๋ช ์ด์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ ์ํ์ ์ ๊ธฐ์ค์ผ๋ก ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋ ์ง(์ ์ผ ์ค๋ ๊ฑธ๋ฆด ์๊ฐ)๋ฅผ ๊ถ๊ธํดํ๊ธฐ ๋๋ฌธ์ Big-O ํ๊ธฐ๋ฒ์ผ๋ก ๋ํ๋ด๊ฒ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ Best, Worst ์ผ์ด์ค ๋ณ๋ก ๊ฐ๊ฐ ํํ์ , ์ํ์ ์ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ๊ฐ๊ฐ Big-Omega, Big-O๋ฅผ ํ๊ธฐํ ์ ์๋ค.
Big-Theta๋ tight bound๋ฅผ ์๋ฏธํ๊ณ , ์ด ์ํ์ ๊ณผ ํํ์ ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ด ๊ฐ๋ ๊ฐ์ ๊ฐ์ผ๋ก ํ๊ธฐํ ์ ์๋ค.
๋ฌด์ง์ฑ์ผ๋ก ์ต์ ์ ์ํฉ = Big-O ํ๊ธฐ๊ฐ์ ์๋๋ ๋ง์ด๋ค.
์ต์ /์ต์ ์ํฉ์ด ์๊ณ ๊ฐ ์ํฉ๋ณ๋ก ๊ธฐ์ค์ (ํํ,์ํ)์ด ์กด์ฌํ๋๊น ํ๊ธฐ๋ ์ด๋ ์ํฉ์ด๊ฑด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋ ์ฐจ์ด
- ์๊ฐ ๋ณต์ก๋ : ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํ๋ด๋ ์ฒ๋
- ๊ณต๊ฐ ๋ณต์ก๋ : ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์์ ๋ํ๋ด๋ ์ฒ๋
๐ ์๊ฐ ๋ณต์ก๋
1. ์๊ฐ ๋ณต์ก๋์ ์ ์
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ๊ฐ๊ณผ ์ฐ์ฐ ์ํ ์๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ์ฒ๋์ด๋ค.
์๊ฐ ๋ณต์ก๋์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์๊ฐ์ ๋ณต์ก๋์ ๋ก์ง์ ์ํ ์๊ฐ์ ๋น๋กํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋์ ์์น๊ฐ ์์ผ๋ฉด ์์ ์๋ก ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์์ ๋ปํ๋ค.
2. ์๊ฐ ๋ณต์ก๋ Case
์ข ๋ฅ | ์๋ฏธ | ํน์ง |
Every-Case Time Complexity ( ๐(๐) ) | ์ ๋ ฅํฌ๊ธฐ n ์ด ์ ๋ ฅ๋์ ๋, ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ฐ์ ์ํํ๋ ํ์ | ์์ multiply ์์ ์ ํด๋น. ์ ๋ ฅ ํฌ๊ธฐ์๋ง ์ข ์๋๊ณ , ์ด๋ค ์ ๋ ฅ๊ฐ์ด ๋ค์ด์ค๋๋ผ๋ ์ผ์ . ๐(๐)์ผ๋ก ๋ถ์๋ ์ ์์ผ๋ฉด ๐(๐) = ๐ด(๐) = ๐ต(๐) = ๐(๐)์ด ๋๋ค. |
The Worst Case Time Complexity( ๐(๐) ) | ์ ๋ ฅํฌ๊ธฐ n ์ด ์ฃผ์ด์ก์ ๋, ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ฐ์ ์ํํ๋ ์ต๋ ํ์ | ์ ๋ ฅํฌ๊ธฐ์ ์ ๋ ฅ๊ฐ ๋ชจ๋์ ์ข ์๋๋ฉฐ, ๋จ์์ฐ์ฐ์ด ์ํ๋๋ ํ์๊ฐ ์ต๋์ธ ๊ฒฝ์ฐ |
The Best Case Time Complexity ( ๐ต(๐) ) | ์ ๋ ฅํฌ๊ธฐ n ์ด ์ฃผ์ด์ก์ ๋, ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ฐ์ ์ํํ๋ ์ต์ ํ์ | ์ ๋ ฅํฌ๊ธฐ์ ์ ๋ ฅ๊ฐ ๋ชจ๋์ ์ข ์๋๋ฉฐ, ๋จ์์ฐ์ฐ์ด ์ํ๋๋ ํ์๊ฐ ์ต์์ธ ๊ฒฝ์ฐ |
The Average Case Time Complexity ( ๐ด(๐) ) |
์ ๋ ฅํฌ๊ธฐ n ์ด ์ฃผ์ด์ก์ ๋, ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ฐ์ ์ํํ๋ ํ๊ท ํ์ | ์ ๋ ฅํฌ๊ธฐ์ ์ ๋ ฅ๊ฐ ๋ชจ๋์ ์ข ์๋๋ฉฐ, ๋ชจ๋ ์ ๋ ฅ์ ๋ํด์ ๋จ์์ฐ์ฐ์ด ์ํ๋๋ ๊ธฐ๋์น |
3. Big-O ํ๊ธฐ๋ฒ์ผ๋ก ๋ณด๋ ์๊ฐ ๋ณต์ก๋
โ ๐(1) < ๐(log n) < ๐(n) < ๐(nlog n) < ๐(n^2) < ๐(n^3) < ๐(2^n) < ๐(n!)
์๊ฐ ๋ณต์ก๋์ ์์์ด๋ค.
๐ก ์๊ฐ ๋ณต์ก๋ ๊ณ์ฐ ์์
1. O(1) - ์์ ์๊ฐ(Contant time) : ์ ๋ ฅ ํฌ๊ธฐ(n)์ ์๊ด์์ด ์ผ์ ํ ์ฐ์ฐ์ ์ํํ๋ ์๊ฐ๋ณต์ก๋ (๋ฐฐ์ด์ ์ธ๋ฑ์ค ์ ๊ทผ)
public void constantTime(int n){
System.out.println("cool");
}
-> n์ ํฌ๊ธฐ๊ฐ ๋ฌด์์ด๋ ๊ฐ์ ์ฐ์ฐ์ 1๋ฒ ์ํ๋จ
2. O(logโ n) - ๋ก๊ทธ ์๊ฐ(Logarithmic time) : ์ ๋ ฅ ํฌ๊ธฐ(n)์ด ์ปค์ง๋ฉด ์ฐ์ฐ ํ์๊ฐ logโ n ์ ๋น๋กํด์ ์ฆ๊ฐํ๋ ์๊ฐ๋ณต์ก๋ (์ด์ง ํ์)
public void LogarithmicTime(int n){
for(int i = 0; i <= n; i*2){
System.out.println("cool");
}
}
-> i ์ฆ๊ฐํญ์ด 2๋ฐฐ -> n์ ๋ก๊ทธ๋งํผ ํ์ ์ฆ๊ฐ
3. O(n) - ์ ํ ์๊ฐ(Linear time) : ์ ๋ ฅํฌ๊ธฐ(n)์ด ์ปค์ง๋ฉด ์ฐ์ฐ ํ์๊ฐ n์ ๋น๋กํด์ ์ฆ๊ฐํ๋ ์๊ฐ๋ณต์ก๋ (์ ํ ๊ฒ์)
public void LinearTime(int n){
for(int i = 0; i <= n; i++){
System.out.println("cool");
}
}
-> n ๋งํผ ์ฆ๊ฐ
4. O(n²) - 2์ฐจ ์๊ฐ(Quadratic time) : ์ ๋ ฅํฌ๊ธฐ(n)์ด ์ปค์ง๋ฉด ์ฐ์ฐ ํ์๊ฐ n²์ ๋น๋กํด์ ์ฆ๊ฐํ๋ ์๊ฐ๋ณต์ก๋ (๋ฒ๋ธ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ)
public void QuadraTime(int n){
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++){
System.out.println("cool");
}
}
}
-> n*m ๋งํผ ์ฆ๊ฐ
5. O(2โฟ) - ์ง์ ์๊ฐ(Expotential time) : ์ ๋ ฅ ํฌ๊ธฐ(n)๊ฐ ์ปค์ง๋ฉด ์ฐ์ฐ ํ์๊ฐ 2โฟ์ ๋น๋กํด์ ์ฆ๊ฐํ๋ ์๊ฐ๋ณต์ก๋ (ํผ๋ณด๋์น ์์ด(๋จ์ ์ฌ๊ท))
public int exponentialTime(int n){
if(n <= 1){
return 1;
}
return exponentialTime(n-1) + exponentialTime(n-2);
}
๐ ๊ณต๊ฐ ๋ณต์ก๋
1. ๊ณต๊ฐ ๋ณต์ก๋์ ์ ์
์๊ณ ๋ฆฌ์ฆ์ด ์ํ๋๋ ๋ฐ ํ์ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋์ ์ธก์ ํ๋ ์ฒ๋์ด๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ S(P) = ๊ณ ์ ๊ณต๊ฐ ์๊ตฌ c + ๊ฐ๋ณ ๊ณต๊ฐ ์๊ตฌ ๐๐(๐)
- ๊ณ ์ ๊ณต๊ฐ : ์ฝ๋ ์ ์ฅ ๊ณต๊ฐ, ๋จ์ ๋ณ์ ๋ฐ ์์, ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฌด๊ด
- ๊ฐ๋ณ ๊ณต๊ฐ : ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ๋์ ์ผ๋ก ํ์ํ ๊ณต๊ฐ. ์ฆ, ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ ๊ณต๊ฐ
- ๊ณ ์ ๊ณต๊ฐ์ ์์์ด๋ฏ๋ก ๊ณต๊ฐ ๋ณต์ก๋๋ ๊ฐ๋ณ ๊ณต๊ฐ์ ์ํด ์ข์ฐ๋๋ค.
๐ก ๊ณต๊ฐ๋ณต์ก๋ ๊ณ์ฐ ์์ ( factorial )
int factorial(int n)
{
if(n > 1) return n * factorial(n - 1);
else return 1;
}
์์ ์ฝ๋๋ n์ด 1์ดํ๊ฐ ๋ ๋๊น์ง ์คํ์ ๋ชจ๋ ์์ด๊ฒ ๋๋ฏ๋ก O(n)์ด๋ผ๊ณ ํ ์ ์๋ค.
int factorial(int n)
{
int i = 0;
int fac = 1;
for(i = 1; i <= n; i++)
{
fac = fac * i;
}
return fac;
}
๋ฐ๋ฉด์ ์์ ์ฝ๋๋ fac ๋ณ์์ i๋ฅผ n๊น์ง ๋๋ฆฌ๋ฉด์ ๊ณฑํ๊ณ ์ ๋ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ์คํ์๋ n, i, fac๋ง ์๊ณ , ์ด ๋ ๊ณต๊ฐ ๋ณต์ก๋๋ O(1)์ด ๋๋ค.
๐ Ref
https://easy-code-yo.tistory.com/13
https://dev-cool.tistory.com/19