πΉ 1. Big-O Notation
big-O: μκ³ λ¦¬μ¦μ ν¨μ¨μ±μ λνλ΄λ μ§ν νΉμ μΈμ΄
[ λΉμ νκΈ° ]
λμ€ν¬μ μλ νμΌμ λ€λ₯Έ μ§μμ μ¬λ μΉκ΅¬μκ² κ°μ₯ 빨리 λ³΄λΌ μ μλ λ°©λ²μ 무μμΌκΉ?
μ΄λ©μΌ, FTP, λ€λ₯Έ μ¨λΌμΈμ ν΅ν μ μ‘ λ°©λ²μ λλΆλΆ μκ°ν κ²
β νμΌ ν¬κΈ°μ λ°λΌ μκ°ν΄λ³΄μμΌ ν¨
1) νμΌ ν¬κΈ°κ° μμ κ²½μ°
β λΉμ°ν μ¨λΌμΈ μ μ‘μ΄ λΉ λ₯Ό κ²μ΄λ€.
λ―Έκ΅μ μλ μΉκ΅¬μκ² μ§μ μ λ¬νλ€λ©΄ 곡νμΌλ‘ κ°μ λΉνκΈ°μ μ€λ₯Έ λ€ μΉκ΅¬κ° μλ κ³³κΉμ§ λ μκ°μΌ ν¨. 5-10μκ° μμ
2) νμΌμ ν¬κΈ°κ° ν° κ²½μ°
β λΉνκΈ°λ₯Ό ν΅ν΄ 물리μ μΌλ‘ λ°°λ¬νλ κ²μ΄ λ λΉ λ₯Ό μ μλ€.
1TB ν¬κΈ°μ νμΌμ μ¨λΌμΈμ ν΅ν΄ μ μ‘νλ € νλ€λ©΄ ν루 μ΄μμ΄ κ±Έλ¦΄ μ μλ€. μ λ§ κΈν μν©μ΄λΌλ©΄ λΉνκΈ°λ₯Ό νλ κ²μ΄ λμμ§λ λͺ¨λ₯Έλ€.
[ μκ° λ³΅μ‘λ ]
μμ μμ λ°μ΄ν° μ μ‘ βμκ³ λ¦¬μ¦βμ μ€νμκ°
μ¨λΌμΈ μ μ‘: O(s) (s: νμΌ ν¬κΈ°)
β νμΌμ ν¬κΈ°κ° μ¦κ°ν¨μ λ°λΌ μ μ‘ μκ° λν μ νμ μΌλ‘ μ¦κ°
λΉνκΈ°λ₯Ό ν΅ν μ μ‘: νμΌ ν¬κΈ°μ κ΄κ³μμ΄ O(1)
β νμΌμ ν¬κΈ°κ° μ¦κ°νλ€κ³ ν΄μ μΉκ΅¬μκ² νμΌμ μ μ‘νλ λ° κ±Έλ¦¬λ μκ°μ΄ λμ΄λμ§ μλλ€. μ¦, μμ μκ°λ§νΌ μμλλ€.
big-O, big-Ξ, big-Ξ©(νκ³)
- O(big-O): μκ³ λ¦¬μ¦ μν μκ°μ μν, βμκ±°λ κ°μβ λΆλ±νΈ
- Ξ©(big-Omega): λ±κ° κ°λ νΉμ νν, Ξ© μν μκ°λ³΄λ€ λΉ λ₯Ό μ μμ
- Ξ(big theta): Oμ Ξ© λ λ€λ₯Ό μλ―Έ. μ΄λ€ μκ³ λ¦¬μ¦μ μνμ΄ O(N)μ΄λ©΄μ Ξ©(N)μ΄λΌλ©΄ Ξ(N)μΌλ‘ νν κ°λ₯
κΈΈμ΄ Nμ λ°°μ΄ μΆλ ₯μ νκΈ°ν λλ O(N) λ§κ³ λ O(N^2), O(N^3) λ±μΌλ‘ νν κ°λ₯νμ§λ§ μ€μ λ‘ μ°λ¦¬λ Ξλ₯Ό μ¬μ©νλ κ²μ²λΌ O(N)μ΄λΌκ³ νννλ€.
μ΅μ μ κ²½μ°, μ΅μ μ κ²½μ°, νκ· μ μΈ κ²½μ°(μ€μ )
ν΅ μ λ ¬(quick sort)μ κ΄μ μμ κ° κ²½μ°λ₯Ό λ°λΌλ³΄μ
μ΅μ μ κ²½μ°: O(N)
λͺ¨λ μμκ° λμΌνλ€λ©΄ ν΅ μ λ ¬μ νκ· μ μΌλ‘ λ¨μν λ°°μ΄μ ν μ°¨λ‘ μννκ³ λλ κ²μ΄λ€.
νΉμ λ°°μ΄μ΄ μ΄λ―Έ μ λ ¬λμ΄ μμ΄λ λ§μ°¬κ°μ§μ΄λ€.
μ΅μ μ κ²½μ°: O(N^2)
μ΄μ΄ μκ² λ°°μ΄μμ κ°μ₯ ν° μμκ° κ³μν΄μ μΆμ΄ λλ€λ©΄(ex.λ°°μ΄μ΄ μμμΌλ‘ μ λ ¬λμ΄ μκ³ μΆμ νμ 첫 λ²μ§Έ μμλ‘ μ§μ ) μ¬κ· νΈμΆμ΄ λ°°μ΄μ μ λ° ν¬κΈ°μ λΆλΆ λ°°μ΄λ‘ λλμ§ λͺ»νκ³ , κ³ μ νλ μ€μ΄λ ν¬κΈ°μ λΆλΆ λ°°μ΄λ‘ λλκ² λλ€.
νκ· μ μΈ κ²½μ°: O(NlogN)
μκ³ λ¦¬μ¦μμ μ΅μ μ κ²½μ°μ νκ· μ μΈ κ²½μ°κ° λλΆλΆ κ°μ§λ§, κ°λ λ¬λΌμ λ λ€ μΈκΈν΄μΌ ν λλ μλ€.
[ κ³΅κ° λ³΅μ‘λ ]
ν¬κΈ°κ° nμΈ λ°°μ΄μ λ§λ€κ³ μ νλ€λ©΄ O(n)μ κ³΅κ° νμ
κ³΅κ° λ³΅μ‘λ μμ
μ¬κ·νΈμΆ μ€ν 곡κ°: O(n)
1 2 3 4 5 6
int sum(int n) { /* μμ 1 */ if (n <= 0) return 0; } return n + sum(n-1); }
νΈμΆλ λλ§λ€ μ€νμ κΉμ΄λ κΉμ΄μ§λ€.
1 2 3 4 5
sum(4) -> sum(3) -> sum(2) -> sum(1) -> sum(0)
μμ νΈμΆμ μ λΆ μ€νμ λν΄μ§κ³ μ€μ λ©λͺ¨λ¦¬ 곡κ°μ μ‘μ λ¨Ήλλ€.
0κ³Ό n μ¬μ΄μμ μΈμ ν λ μμμ ν© κ΅¬νκΈ°: O(1)
1 2 3 4 5 6 7 8 9 10 11
int pairSumSequence(int n) { /* μμ 2 */ int sum = 0; for (int i = 0; i < n; i++) { sum += pairSum(i, i + 1); } return sum; } int pairSum(int a, int b) { return a + b; }
μ μ½λλ pairSum ν¨μλ₯Ό λλ΅ O(n)λ² νΈμΆνμ§λ§, μ΄ ν¨μλ€μ΄ νΈμΆ μ€νμ λμμ μ‘΄μ¬νμ§ μμΌλ―λ‘ O(1) 곡κ°λ§ μ¬μ©νλ€.
[ μμνμ 무μνλΌ ]
λ κ°μ μ€μ²©λμ§ μμ 루νλ‘ μ΄λ£¨μ΄μ§ μ½λλ₯Ό O(2N)μ΄ μλ O(N)μΌλ‘ νκΈ°νλ€.
O(2N)μ΄ λ μ ννμ§ μμ κ°μ λν λ°λ μμλ₯Ό μλμμ 보μ¬μ€λ€.
μ΅μμ μ΅λ 1
1
2
3
4
5
6
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int x: array) {
if (x < min) min = x;
if (x > max) max = x;
}
μ΅μμ μ΅λ 2
1
2
3
4
5
6
7
8
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int x : array) {
if (x < min) min = x;
}
for (int x : array) {
if (x > max) max = x;
}
1λ² μμμ 2λ² μμ μ€ forλ¬Έμ ν λ²λ§ μ¬μ©ν 1λ² μμ κ° λ λΉ λ₯Έκ°?
μμΈν νμ ν νμλ μμ§λ§ big-O νκΈ°λ²μ μν μκ°μ΄ μ΄λ»κ² λ³ννλ μ§λ₯Ό νννλ λꡬμ΄λ€. λ°λΌμ O(2N)μ΄ μΈμ λ O(N)λ³΄λ€ λμ κ²μ μλλΌλ μ¬μ€λ§ λ°μλ€μ΄λ©΄ λλ€.
[ μ§λ°°μ μ΄μ§ μμ νμ 무μνλΌ ]
O(N^2 + N)κ³Ό κ°μ μμμ΄ μμ λ Nμ μμνμ μλμ§λ§ νΉλ³ν μ€μν νμ μλλ€.
O(N^2 + N^2)μ μ΄μ μ μμνμ 무μνλΌ νμμΌλ―λ‘ O(N^2)μ΄ λλ€. κ·Έλ λ€λ©΄ λ€μ N^2νμ 무μν κ²μ΄λ€. β N^2λ 무μνμΌλ Nμ 무μνλ κ²λ κ°λ₯νλ€.
μ΄μ²λΌ μμμμ μ§λ°°μ μ΄μ§ μμ νμ 무μν΄λ λλ€.
- O(N^2+N) β O(N^2)
- O(N+logN) β O(N)
- O(5*2^N + 1000N^100) β O(2^N)
νμ§λ§ μ¬μ ν μμμ ν©μ΄ λ¨μμμ μ μλ€.
O(B^2+A)λ νλμ νμΌλ‘ μ€μΌ μ μλ€. (Aλ₯Ό Bλ‘ ννκ°λ₯νκ±°λ, Bλ₯Ό Aλ‘ νν κ°λ₯νμ§ μλ μ΄μ)
big-O μκ°μ μ¦κ°μ¨
\[O(logN) < O(N) < O(NlogN) < O(N^2) < O(2^N) < O(N!)\][ μ¬λ¬ λΆλΆμΌλ‘ μ΄λ£¨μ΄μ§ μκ³ λ¦¬μ¦: λ§μ vs κ³±μ ]
λ§μ μν μκ°: O(A+B)
1
2
3
4
5
6
for (int a : arrA) {
print(a);
}
for (int b: arrB) {
print(b);
}
κ³±μ μν μκ°: O(A*B)
1
2
3
4
5
for (int a : arrA) {
for (int b : arrB) {
print(a + "," + b);
}
}
μΌμͺ½ μμ μμ AμΌμ ν λ€ Bμ μΌμ μννλ€. λ°λΌμ μ 체 μνν μΌμ O(A+B)μ΄λ€.
μ€λ₯Έμͺ½ μμ μμλ Aμ κ° μμμ λν΄ Bμ μΌμ μννλ€. λ°λΌμ μ 체 μνν μΌμ O(A*B)κ° λλ€.
- AμΌκ³Ό Bμ μΌμ΄ λ³κ°λ‘ μ΄λ£¨μ΄ μ§λ€ β μνμκ°μ ν©
- AμΌμ ν λ B μΌμ΄ μνλλ€. νΉμ κ·Έ λ°λ β μνμκ°μ κ³±
[ μν μκ° ]
ArrayList(λμ κ°λ³ν¬κΈ° λ°°μ΄)μ μ½μ μ°μ°μ μνμκ°
λ°°μ΄μ΄ κ°λ μ°¨ μλ κ²½μ°(λλ¬Έ κ²½μ°)
λ°°μ΄μ Nκ°μ μμκ° λ€μ΄ μμ λ μλ‘μ΄ μμλ₯Ό μ½μ νλ €λ©΄ O(N)μ΄ κ±Έλ¦°λ€.
β ν¬κΈ°κ° 2NμΈ λ°°μ΄μ μλ‘ λ§λ€κ³ κΈ°μ‘΄μ λͺ¨λ μμλ₯Ό μ λ°°μ΄λ‘ 볡μ¬ν΄μΌ νκΈ° λλ¬Έ
λ°°μ΄μ΄ κ°λ μ°¨ μμ§ μμ κ²½μ°(νμμ κ²½μ°)
μ½μ μ°μ°μ O(1)μ΄ κ±Έλ¦°λ€.
λ κ°μ§ κ²½μ°λ₯Ό ν¬ν¨ν μ 체 μν μκ°μ λ°μ Έ λ³Ό λ, μν μκ°μ΄λΌλ κ°λ μ μ΄μ©νλ€.
μν μκ°: μ΅μ μ κ²½μ°λ κ°λ λ°μνμ§λ§ ν λ² λ°μνλ©΄ κ·Έ νλ‘ κ½€ μ€λ«λμ λνλμ§ μμΌλ―λ‘ λΉμ©(μν μκ°)μ λΆν μννλ€λ κ°λ
κ·Έλ λ€λ©΄ ArrayListμ κ²½μ° μνμκ°μ?
λ°°μ΄μ ν¬κΈ°κ° 2μ μΉμκ° λμμ λ μμλ₯Ό μ½μ νλ©΄ μ©λμ΄ 2λ°°λ‘ μ¦κ°
λ°°μ΄μ ν¬κΈ°κ° 1, 2, 4, 8, 16, β¦ , XμΌ λ μλ‘μ΄ μμλ₯Ό μ½μ νλ©΄ λ°°μ΄μ μ©λ 2λ°°λ‘ μ¦κ° ν κΈ°μ‘΄ μμλ₯Ό μλ‘μ΄ λ°°μ΄λ‘ 볡μ¬ν΄μ£Όμ΄μΌ νλ€.
μ΄λ ν© 1+2+4+8+16+β¦+X μ? μ΄ μμ΄μ μ°¨λ‘λ‘ μ½μΌλ©΄ 1μμ XκΉμ§ λ λ°°μ© μ¦κ°νλ μμ΄μ΄λ€.
X+X/2+X/4+X/8+β¦+1μ ν©μ λλ΅ 2Xμ κ°λ€.
β λ°λΌμ Xκ°μ μμλ₯Ό μ½μ νμ λ νμν μκ°μ O(2X)μ΄κ³ , μ΄λ₯Ό λΆν μνν΄λ³΄λ©΄ μ½μ ν λ²μ νμν μκ°μ O(1)μ΄λ€.
[ log N μν μκ° ]
λνμ μΈ μμλ‘ μ΄μ§νμ(binary search)κ° μλ€.
μ΄μ§νμ
- Nκ°μ μ λ ¬λ μμκ° λ€μ΄ μλ λ°°μ΄μμ μμ xλ₯Ό μ°Ύμ λ μ¬μ©λλ€.
- μμ xμ λ°°μ΄μ μ€κ° κ°μ λΉκ΅
- x = μ€κ°κ° : λ°ν
- x < μ€κ°κ° : λ°°μ΄μ μΌμͺ½ λΆλΆ μ¬νμ
- x > μ€κ°κ° : λ°°μ΄μ μ€λ₯Έμͺ½ λΆλΆ μ¬νμ
κ° λμμ΄ μνλ λλ§λ€ νμν΄μΌν μμμ κ°μκ° N/2λ‘ μ€μ΄λ λ€. κ·Έλ¬λ€κ° μμλ₯Ό μ°Ύμκ±°λ νμν΄μΌν μμκ° νλλ§ λ¨μΌλ©΄ νμμ μ€μ§νλ€.
μ΄ μν μκ°μ Nμ μ λ°μ© λλλ κ³Όμ μμ λͺ λ¨κ³ λ§μ 1μ΄ λλμ§μ λ°λΌ κ²°μ λλ€.
λ°λλ‘ μκ°ν΄λ³΄λ©΄ 1μμ 16μΌλ‘ μ¦κ°ν λ 2λ₯Ό λͺ λ² κ³±ν΄μΌ Nμ΄ λλμ§ νμΈν΄λ³Έλ€.
μ¦, 2^k = Nμ λ§μ‘±νλ kλ logNμ΄λ€.
μ΄λ€ λ¬Έμ μμ μμμ κ°μκ° μ λ°μ© μ€μ΄λ λ€λ©΄ κ·Έ λ¬Έμ μ μν μκ°μ O(logN)μ΄ λ κ°λ₯μ±μ΄ ν¬λ€.
κ°μ μ리λ‘, κ· ν μ΄μ§ νμ νΈλ¦¬(balanced binary search tree)μμ μμλ₯Ό μ°Ύλ λ¬Έμ λ O(logN)μ΄λ€.
β 맀 λ¨κ³λ§λ€ μμμ λμλ₯Ό λΉκ΅ν ν μΌμͺ½ νΉμ μ€λ₯Έμͺ½μΌλ‘ λ΄λ €κ°λ€. κ° λ¨κ³μμ κ²μν΄μΌν λ Έλμ κ°μκ° μ λ°μ© μ€μ΄λ€κ² λλ€.
[ μ¬κ·μ μΌλ‘ μν μκ° κ΅¬νκΈ° ]
μλ μ½λλ μν μκ°μ ꡬνκΈ° μ½κ° κΉλ€λ‘λ€.
1
2
3
4
5
6
int f(int n) {
if (n <= 1) {
return 1;
}
return f(n - 1) + f(n - 1);
}
ν¨μ fκ° λ λ² νΈμΆλ κ²μ λ³΄κ³ O(N^2)λΌ κ²°λ‘ λ΄λ¦°λ€λ©΄ νλ Έλ€.
νΈλ¦¬μ κΉμ΄κ° Nμ΄κ³ , κ° λ Έλ(ν¨μ νΈμΆ)λ λ κ°μ μμ λ Έλλ₯Ό κ°μ§κ³ μλ€.
λ°λΌμ κΉμ΄κ° ν λ¨κ³ κΉμ΄μ§ λλ§λ€ μ΄μ μ λ λ°° λ λ§μ΄ νΈμΆνλ€.
λ°λΌμ μ 체 λ Έλμ κ°μλ
\[2^0 + 2^1 + 2^2 + 2^3 + 2^4 + β¦ + 2^N (=2^{N+1} - 1)\]μ΄μ²λΌ λ³΄ν΅ μ¬κ· ν¨μμμ μνμκ°μ O(λΆκΈ°^κΉμ΄)λ‘ ννλκ³€ νλ€. λ°λΌμ μμ κ²½μ° μνμκ°μ O(2^N)μ΄ λλ€.
μ΄ μκ³ λ¦¬μ¦μ κ³΅κ° λ³΅μ‘λλ O(N)μ΄ λ κ²μ΄λ€. μ 체 λ Έλμ κ°μλ O(2^N)μ΄μ§λ§, νΉμ μκ°μ μ¬μ©νλ 곡κ°μ ν¬κΈ°λ O(N)μ΄λ€.