๐ค ์๊ณ ๋ฆฌ์ฆ - ๋น ์ค ํ๊ธฐ๋ฒ ์ ๋ฆฌ
๋น ์ค ํ๊ธฐ๋ฒ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
7) ์๊ณ ๋ฆฌ์ฆ - ๋น ์ค ํ๊ธฐ๋ฒ ์ ๋ฆฌ
๋น ์ค(Big-O)
์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ํ์ ์ผ๋ก ํ๊ธฐํด์ฃผ๋ ํ๊ธฐ๋ฒ
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ, ๊ณต๊ฐ ๋ณต์ก๋๋ฅผ ํํํ ์ ์์
์๊ณ ๋ฆฌ์ฆ์ ์ค์ running time์ ํ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํ๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์์ ์ฆ๊ฐ์จ์ ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์์ธกํ๋ ๊ฒ์ด ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ์์์ ๊ฐ์ ์ซ์๋ค์ ๋ชจ๋ 1์ด๋๋ค.
O(1)
์๊ณ ๋ฆฌ์ฆ1 2 3
public boolean F(int[] n) { return (n[0] == 0) ? true : false; }
์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด ์์ด ์ธ์ ๋ ์ผ์ ํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ.
ํจ์๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฐ์ด ๋ฐฉ์ ๊ฐ์ด 0์ธ์ง๋ฅผ ํ์ธํ๋ค. ์ธ์๋ก ๋ฐ๋ ๋ฐฐ์ด ๋ฐฉ์ ๊ฐ์ด ์ผ๋ง๋ ํฐ์ง ์๊ด ์์ด ์ธ์ ๋ ์ผ์ ํ ์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- ์๋ฅผ ๋ค์ด ๊ฐ๋ก์ถ์ด ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ด๊ณ ์ธ๋ก์ถ์ ์ฒ๋ฆฌ ์๊ฐ์ด๋ผ๊ณ ํ ๋ ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฑ๋ฅ์ ๋ณํ๊ฐ ์๋ค.
O(n)
์๊ณ ๋ฆฌ์ฆ1 2 3 4 5
public void F(int[] n) { for (int i = 0; i < n.length; i++) { System.out.println(i); } }
์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋น๋กํด์ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํํํ ๋ ์ฌ์ฉ.
ํจ์๋ n๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด n๋ฒ ๋ฃจํ๋ฅผ ๋๋๊น n์ด ํ๋ฒ ๋์ด๋ ๋๋ง๋ค ์ฒ๋ฆฌ๊ฐ ํ๋ฒ ์ฉ ๋์ด๋์ n์ ํฌ๊ธฐ๋งํผ ์ฒ๋ฆฌ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋น๋กํด์ ์ฒ๋ฆฌ ์๊ฐ๋ ๊ฐ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ธ์ ๋ ๋ฐ์ดํฐ์ ์๊ฐ์ด ๊ฐ์ ๋น์จ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํ๋ ์ง์ ์ผ๋ก ํํ๋๋ค.
O(nยฒ)
์๊ณ ๋ฆฌ์ฆ1 2 3 4 5 6 7
public void F(int[] n) { for (int i = 0; i < n.length; i++) { for (int j = 0; j < n.length; j++) { System.out.println(i + j); } } }
n์ ๋๋ฆฌ๋ฉด์ ๊ทธ ์์์ n์ผ๋ก ๋ฃจํ๋ฅผ ๋ ๋๋ฆด ๋, nยฒ์ด ๋๋ค.
๊ทธ๋์ n๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฃจํ์์ n๋ฒ ๋๋ฉด์ ๊ฐ๊ฐ์ element์์ n๋ฒ์ฉ ๋ ๋๋๊น ์ฒ๋ฆฌ ํ์๊ฐ n์ ๊ฐ๋ก ์ธ๋ก ๊ธธ์ด๋ก ๊ฐ์ง๋ ๋ฉด์ ๋งํผ ๋๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์ n์ด ํ ๋ฒ ๋์ด๋ ๋๋ง๋ค ์๋ ํ ์ค, ์ค๋ฅธ์ชฝ ํ ์ค(ํ, ์ด) n๋งํผ์ฉ ๋ ๋ถ์ผ๋๊น ๋ฐ์ดํฐ๊ฐ ์ปค์ง๋ฉด ์ปค์ง ์๋ก ์ฒ๋ฆฌ ์๊ฐ์ ๋ถ๋ด๋ ์ปค์ง๋ค.
- ์ฒ์์๋ ์กฐ๊ธ์ฉ ์์นํ๋ค๊ฐ ๋์ค์๋ ์์ง ์์น๋๋ค.
O(nm)
์๊ณ ๋ฆฌ์ฆ1 2 3 4 5 6 7
public void F(int[] n, int[] m) { for (int i = 0; i < n.length; i++) { for (int j = 0; j < m.length; j++) { System.out.println(i + j); } } }
- n์ ๋ ๋ฒ ๋๋ฆฌ๋ ๊ฒ ์๋๋ผ n์ m๋งํผ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
n์ ์์ฒญ ํฌ๊ณ m์ ์์ฒญ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ณ์๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋น ์ค ํ๊ธฐ๋ฒ์๋ ๋ค๋ฅด๊ฒ ํ์๋ฅผ ํด์ผ๋๋ค!
๊ทธ๋ํ๋ O(nยฒ)์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ ์๋ก ์์ง์ ๊ฐ๊น์ด ๊ธฐ์ธ๊ธฐ๊ฐ ๋๋ค.
O(nยณ)
์๊ณ ๋ฆฌ์ฆ1 2 3 4 5 6 7 8 9
public void F(int[] n) { for (int i = 0; i < n.length; i++) { for (int j = 0; j < n.length; j++) { for (int k = 0; k < n.length; k++) { System.out.println(i + j + k); } } } }
- ๋ฃจํ๋ฅผ n์ ๊ฐ์ง๊ณ 3์ค์ผ๋ก ๋๋ฆฌ๋ฉด nยณ์ด ๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ ๊ฐ๋ก, ์ธ๋ก, ๋์ด๊น์ง ๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๋๋ O(nยฒ)๋ณด๋ค ๋ ๊ธ๊ฒฉํ๊ฒ ์์ง ์์นํ๋ ๊ทธ๋ํ๊ฐ ๋๋ค.
O(2โฟ)
์๊ณ ๋ฆฌ์ฆ- ํผ๋ณด๋์น(Fibonacci) ์์ด
ํ ๋ฉด์ ๊ธฐ์ค์ผ๋ก ์ ์ฌ๊ฐํ์ ๋ง๋ ๋ค. ์ฒ์์ 1์ผ ๊ฒ. ๊ทธ๋ ๋ค๋ฉด ๊ทธ ํ์ 1์ด 2๊ฐ๊ฐ ๋ถ์ด์ ์ง์ฌ๊ฐํ์ด ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ๋ก๊ฐ 2์ผ ๊ฒ์ด๊ณ ๊ทธ๊ฑธ ๊ธฐ์ค์ผ๋ก ์ ์ฌ๊ฐํ์ ๋ง๋ ๋ค.
๊ทธ๋ฌ๋ฉด ๋์ด๋ ๋ฉด์ด 3์ด ๋๋ค. ๋ ์ด ๋ฉด์ ๊ธฐ์ค์ผ๋ก ์ ์ฌ๊ฐํ์ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฉด ์ง์ฌ๊ฐํ์ผ๋ก ๋ ํ ๋ฉด์ด 5๊ฐ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ฉด์ ๊ธฐ์ค์ผ๋ก ์ ์ฌ๊ฐํ์ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฉด 8์ด ๋๊ณ ..
1 -> 2 -> 3 -> 5 ->8 -> 13 -> 21 -> 34 -> 55
์ด๋ฐ์์ผ๋ก ๊ธฐํํ์ ํฉ๊ธ๋น์จ์ธ ํผ๋ณด๋์น์ ๋์ ํ์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค.์ํ์ ์ผ๋ก ์ ๊ทผํ๋ฉด
1-> 1-> 2-> 3 -> 5 -> 8 -> 13 -> 21 -> 34 -> 55
์ด ๋ถ๋ถ์1์ ๋ ๋ฒ ๋ํด์ 2๊ฐ ๋๊ณ 1+2 = 3, 3+5 = 8, 3+5 = 8 ยทยทยท 21+34 = 55๊ฐ ๋๋ค.
ํผ๋ ธ์ฐจ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด์ ํ๋ฉด
1 2 3 4 5 6 7 8 9 10
public int F(int n, int[] r) { if (n <= 0) { return 0; } else if (n == 1) { r[n] = 1; return r[n]; } r[n] = F(n - 1, r) + F(n - 2, r); return r[n]; }
- ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ฐ๋ก ์ ์ ์ซ์์ ์ ์ ์ซ์๋ฅผ ์์์ผ ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ซ์๋ฅผ ์์๋ด๊ธฐ ์ํด์ ํ๋ ๋บ ์ซ์๋ฅผ ๊ฐ์ง๊ณ ์ฌ๊ทํธ์ถ์ ํ๊ณ , ๊ทธ ๋ค์ ๋ ๋ฒ ๋บ ์ซ์๋ฅผ ๊ฐ์ง๊ณ ์ฌ๊ทํธ์ถ์ ํ๋ค.
- ์ด๋ ๊ฒ ๋งค๋ฒ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค 2๋ฒ์ฉ ๋ ํธ์ถ์ ํ๋๋ฐ ๊ทธ๊ฑธ ํธ๋ฆฌ์ ๋์ด๋งํผ ๋ฐ๋ณตํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ํ๋ก ๋ณด๋ฉด ๋ฐ์ดํฐ์ ์ฆ๊ฐ๋์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์์ ์ดํด๋ณธ O(nยฒ)์ด๋ O(nยณ)๋ณด๋ค ํจ์ฌ ์์ง ์์น๋์ด์๋ค.
O(log n)
์๊ณ ๋ฆฌ์ฆ- ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ง ๊ฒ์(์ด์ง ํ์)์ด๋ค.
์ด์ง ๊ฒ์์ ํ๋ ค๋ฉด ์ฐ์ ๊ฐ์ด๋ฐ ๊ฐ์ ์ฐพ์์ key๊ฐ(์ง๊ธ ๊ตฌํ๋ ค๋ ์)๊ณผ ๋น๊ต๋ฅผ ํ๋ค.
2<7์ด๋ฏ๋ก ๋ท ๋ถ๋ถ์ ๋ฒ๋ฆฌ๊ณ ์ ๋ถ๋ถ๋ง ํ์ํ๋ค.
๊ฐ์ด๋ฐ ๊ฐ์ด 3์ ๊ฐ์ง๊ณ ๋น๊ตํ๋ค. 2<3 ์ด๋ฏ๋ก ์ ๋ถ๋ถ๋ง ๋ค์ ํ์ํ๋ค.
2>1 ์ด๋ฏ๋ก ๋ค์ ํ์ํ๊ณ ๋ ์ด์ ๋จ์ ํญ๋ชฉ์ด ์์ผ๋ฏ๋ก ํ์ ์คํจ.
์ด๋ ๊ฒ ํ ๋ฒ ์ฒ๋ฆฌ๊ฐ ์งํ๋ ๋๋ง๋ค ๊ฒ์ํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ด ์ ๋ฐ์ฉ ๋ ๋ ๋จ์ด์ง๋ ๊ฒ์ O(log n) ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public int F(int k, int[] arr, int s, int e) { if (s > e) { return -1; } int m = (s + e) / 2; if (arr[m] == k) { return m; } else if (arr[m] > k) { return F(k, arr, s, m - 1); } else { return F(k, arr, m + 1, e); } }
์ฒ์ ํธ์ถ ๋ ๋๋ ์์ ๋ถ๋ถ์ 0, ๋ ์ ์ ๋ฐฐ์ด์ ๋งจ ๋ง์ง๋ง ๋ฐฉ์ด ๋๋ค.
int m = (s + e) / 2;
์ฃผ์ด์ง range์ ์ค๊ฐ๊ฐ์ ์ฐพ๋๋ค.์ฐพ๋ ๊ฐ์ด ์ค๊ฐ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ์ค๊ฐ ์ง์ ๋ฐ๋ก ์ ๊น์ง range๋ฅผ ์กฐ์ ํด์ ๋ค์ ํธ์ถํ๊ณ ์ค๊ฐ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ค๊ฐ ์ง์ ๋ค์ ๋ฐฉ๋ถํฐ range๋ฅผ ์กฐ์ ํด์ ๋ค์ ํธ์ถํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ํ ๋ฒ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ค๊ฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ฐ์ ๊ฒ์ ์์ญ์์ ์ ์ธ์์ผ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์์ฐจ ๊ฒ์์ ๋น๊ตํด์ ์๋๊ฐ ํ์ ํ๊ฒ ๋น ๋ฅด๋ค.
O(log n)์ด O(n)๋ณด๋ค๋ ํจ์ฌ ์ ๊ฒ ๋ ๋ค. ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํด๋ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ฐจ์ด๋์ง ์๋๋ค.
๐ ์ค์ํ ๋ถ๋ถ
- ๋น ์ค ํ๊ธฐ๋ฒ์์ ์์๋ ๊ณผ๊ฐํ๊ฒ ๋ฒ๋ฆฐ๋ค!
1 2 3 4 5 6 7 8 9 10 11
public void F(int[] n) { // ์ฒซ ๋ฒ์งธ for ๋ฃจํ for (int i = 0; i < n.length; i++) { System.out.println(i); } // ๋ ๋ฒ์งธ for ๋ฃจํ for (int i = 0; i < n.length; i++) { System.out.println(i); } }
ํด๋น ์ฝ๋๋ ์๊ฐ ๋ณต์ก๋๊ฐ ์ผ๋ง์ผ๊น? ์ด๊ฑด n๋งํผ์ฉ 2๋ฒ ๋๋ฆฌ๋๊น 2n๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋ฐ๋ฐ ๋น ์ค ํ๊ธฐ๋ฒ์์๋ O(2n)์ ๊ทธ๋ฅ O(n)์ผ๋ก ํ์ํ๋ค!
์๋ํ๋ฉด ๋น ์ค ํ๊ธฐ๋ฒ์ ์ค์ ์๊ณ ๋ฆฌ์ฆ์ running time์ ์ธก์ ํ๊ธฐ ์ํด ๋ง๋ ๊ฒ ์๋๋ผ ์ฅ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์๊ฐ์ ์ฆ๊ฐ์จ์ ์์ธกํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํ๊ธฐ๋ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์์๋ ๊ณ ์ ๋ ์ซ์์ด๋ฏ๋ก ์ฆ๊ฐ์จ์ ์ํฅ์ ์ฃผ์ง์๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก O(nยฒ+ nยฒ) ๋ O(nยฒ)๋ก ํ๊ธฐํ๋ค.