π’ 1. Big-O Notation
π‘ Big O(λΉ -μ€) νκΈ°λ² : O(N)
μκ³ λ¦¬μ¦Β μ΅μ μ μ€ν μκ°μ νκΈ°
μ무리 μ΅μ μ μν©μλ, μ΄μ λ μ±λ₯μ 보μ₯νλ€λ μλ―Έ
Ξ© (μ€λ©κ°) νκΈ°λ² : Ξ©(N)
μκ³ λ¦¬μ¦Β μ΅μμ μ€ν μκ°μ νκΈ°
Ξ(μΈν) νκΈ°λ² : Ξ(N)
μκ³ λ¦¬μ¦Β νκ· Β μ€ν μκ°μ νκΈ°
μκ° λ³΅μ‘λ : μκ³ λ¦¬μ¦μΒ μ€ν μλ
κ³΅κ° λ³΅μ‘λ : μκ³ λ¦¬μ¦μ΄ μ€νλ λ λ©λͺ¨λ¦¬λ₯Ό μΌλ§λ μ¬μ©νλκ°
λΉ μ€ νκΈ°λ² :Β μκ° λ³΅μ‘λλ₯Ό λνλ΄λ νκΈ°λ²
𫧠λΉμ νκΈ°
νμΌ ν¬κΈ°κ° μλ€λ©΄ ? μ¨λΌμΈμΌλ‘ μ μ‘
νμΌ ν¬κΈ°κ° 무μ§λ§νκ² ν¬λ€λ©΄ ? μ΄μ or λΉνκΈ°π
𫧠μκ° λ³΅μ‘λ
μ κ·Όμ μ€ν μκ° (asymptotic runtime), big-O μκ° κ°λ
- μ¨λΌμΈ μ μ‘ : O(s), sλ νμΌμ ν¬κΈ°
- νμΌμ ν¬κΈ°κ° μ¦κ°ν¨μ λ°λΌ μ μ‘ μκ°μ΄ μ νμ μΌλ‘ μ¦κ°
- λΉνκΈ° μ μ‘ : νμΌμ ν¬κΈ° μκ΄μμ΄ O(1)
- μμμκ°λ§νΌ μμ
- β€οΈ big-O
μκ°μ μν
λ°°μ΄μ λͺ¨λ κ°μ μΆλ ₯νλ μκ³ λ¦¬μ¦
O(n) λΏλ§ μλλΌ, O(n^3) νΉμ O(n) λ³΄λ€ ν° μ΄λ€ μν μκ°μΌλ‘ κ°λ₯
- β€οΈ big-Ξ© (omega)
λ±κ° or νν
Ξ©(n) λΏλ§ μλλΌ, Ξ©(log N) νΉμ Ξ©(1) λ‘ νν κ°λ₯
β€οΈ big-ΞΈ (theta)
- : Oμ Ξ© λ λ€ μλ―Έ (λ± λ§λ μν μκ°)
O(n) μ΄λ©΄μ Ξ©(n) μ΄λΌλ©΄, μν μκ°μ ΞΈ(n) λ‘ νν κ°λ₯
1 2 3 π ν΅ μ λ ¬ κ΄μ βμΆβμ΄ λλ μμ νλλ₯Ό 무μμλ‘ λ½μ λ€, μ΄λ³΄λ€ μμ μμλ€μ μμ, ν° μμλ€μ λ€μ λμ΄λλ‘ νλ€ κ·Έ κ²°κ³Ό, λΆλΆ μ λ ¬ μμ±λκ³ μΌμͺ½ μ€λ₯Έμͺ½ λΆλΆμ μ΄μ λΉμ·νκ² μ¬κ·μ μΌλ‘ μ λ ¬νλ€
- 𧑠μ΅μ μ κ²½μ°
λͺ¨λ μμκ° λμΌνλ€λ©΄ λ¨μν λ°°μ΄μ νμ°¨λ‘ μννκ³ λ
μν μκ°μ O(n)
- 𧑠μ΅μ μ κ²½μ°
λ°°μ΄μμ κ°μ₯ ν° μμκ° μΆμ΄ λλ€λ©΄, μ λ° ν¬κΈ°κ° μλ κ³ μ νλ μ€μ΄λ ν¬κΈ°μ λΆλΆ λ°°μ΄λ‘ λλκ² λλ€
μν μκ°μ O(n^2)
- 𧑠νκ· μ κ²½μ°
μν μκ°μ O(nlogn)
π«§ κ³΅κ° λ³΅μ‘λ
: λ©λͺ¨λ¦¬ or 곡κ°
𫧠μμνμ 무μνλΌ
: λ¨μν μ¦κ° λΉμ¨μ λνλ΄λ―λ‘, μμν 무μνκΈ°
𫧠μ§λ°°μ μ΄μ§ μμ νμ 무μνλΌ
- : μ΅κ³ μ°¨ν λ³΄λ€ μμ νλ€μ 무μν΄λ λλ€
ex) O(n^2 + n) μ O(n^2)
𫧠μ¬λ¬ λΆλΆμΌλ‘ μ΄λ£¨μ΄μ§ μκ³ λ¦¬μ¦: λ§μ vs κ³±μ
- : μκ³ λ¦¬μ¦μ΄ βA λλ ν B μννλΌβ β A + B
μκ³ λ¦¬μ¦μ΄ βA ν λ B μννλΌβ β A * B
𫧠μν μκ°
- : ArrayList λ λ°°μ΄μ μν + ν¬κΈ°κ° μμ λ‘μ΄ μλ£κ΅¬μ‘°
xκ°μ μμλ₯Ό μ½μ νμ λ νμ μκ°μ O(2x), λΆν μνν΄μ μ½μ νλ²μ νμν μκ°μ O(1)
𫧠log N μν μκ°
: μ΄μ§ νμ(binary search) λ nκ°μ μ λ ¬λ μμκ° λ€μ΄ μλ λ°°μ΄μμ μμ xλ₯Ό μ°Ύμ λ μ¬μ©
- λ¨Όμ μμ xμ λ°°μ΄μ μ€κ°μ λΉκ΅
- x === μ€κ°κ° λ§μ‘±νλ©΄ λ°ν
- x < μ€κ°κ° λ§μ‘±νλ©΄ λ°°μ΄μ μΌμͺ½ μ¬νμ
- x > μ€κ°κ° λ§μ‘±νλ©΄ λ°°μ΄μ μ€λ₯Έμͺ½ μ¬νμ
- μμ nκ°μ λ°°μ΄μμ μμ
- ν λ¨κ³ μ§λ μλ‘ n/2κ°, n/4κ°λ‘ μ€μ΄λ λ€
- : 2^k = n μμ kλ log(n)
μμμ κ°μλΌ μ λ°μ© μ€μ΄λ λ€λ©΄ κ·Έ λ¬Έμ μ μ€ν μκ°μ O(log n)
κ· ν μ΄μ§ νμ νΈλ¦¬ (balanced binary search tree) μμλ O(log n)
맀 λ¨κ³λ§λ€ μμμ λμλ₯Ό λΉκ΅ν λ€ μΌμͺ½ νΉμ μ€λ₯Έμͺ½μΌλ‘ λ΄λ €κ°
κ° λ¨κ³μμ κ²μν΄μΌ ν λ Έλμ κ°μκ° μ λ°μ© μ€μ΄λλ―λ‘, λ¬Έμ κ³΅κ° λν μ λ°μ© μ€μ΄λ¦
𫧠μ¬κ·μ μΌλ‘ μν μκ° κ΅¬νκΈ°
- : λ€μμ νΈμΆλ‘ μ΄λ£¨μ΄μ§ μ¬κ· ν¨μμμ μν μκ°μ O(λΆκΈ°^κΉμ΄)λ‘ νν
λΆκΈ°(branch)λ μ¬κ· ν¨μκ° μμ μ μ¬νΈμΆνλ νμ
𫧠μμ λ° μ°μ΅ λ¬Έμ
π μμ 1
β‘οΈ O(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo(int[] array) {
int sum = 0;
int product = 1;
for (int i = 0; i < array.length; i++) {
sum+= array[i];
}
for (int i = 0; i < array.length; i++) {
product *= array[i];
}
System.out.println(sum + ", " + product);
}
π μμ 2
β‘οΈ O(n^2)
1
2
3
4
5
6
7
void printPairs(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
System.out.println(array[i] + ", " + array[j]);
}
}
}
π μμ 3
β‘οΈ O(n^2)
1
2
3
4
5
6
7
void printUnorderedPairs(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
System.out.println(array[i] + ", " + array[j]);
}
}
}
π μμ 4
β‘οΈ O(ab)
1
2
3
4
5
6
7
8
9
void printUnorderedPairs(int[] arrayA, int[] arrayB) {
for (int i = 0; i < arrayA.length; i++) {
for (int j = 0; j < arrayB.length; j++) {
if (arrayA[i] < arrayB[i]) {
System.out.println(arrayA[i] + ", " + arrayB[j]);
}
}
}
}