
π μ£Όμ
μ΄λ² ν¬μ€ν μμλ μλ£κ΅¬μ‘°μ μκ³ λ¦¬μ¦μμ μκ³ λ¦¬μ¦μ μ±λ₯μ λ°μ§ λ μ€μν νκΈ°λ²μΈ Big O νκΈ°λ²μ κ°λ μ μ΄ν΄λ³΄κ³ , λͺ κ°μ§ μμλ₯Ό λ€μ΄λ³΄κ³ μ νλ€.
Big O νκΈ°λ²
μκ³ λ¦¬μ¦μ 볡μ‘λλ₯Ό λνλΌ λ Big Θ, Big Ω νκΈ°λ² λ± μ¬λ¬ λ°©λ²μ΄ μμ§λ§
κ°μ₯ λ§μ΄ μ°λ 건 Big O νκΈ°λ²μΈ λ― νλ€.
μ μ
μκ³ λ¦¬μ§μ μ±λ₯μ λνλ΄λ λ²μΌλ‘ μκ³ λ¦¬μ¦μ΄ μΌλ§λ λΉ λ₯΄κ³ ν¨μ¨μ μΈμ§λ₯Ό μλ‘ νννλ€.
μκ³ λ¦¬μ¦μμ ν¨μ¨μ κ³μ°ν λ μ€μν 건 'λ°μ΄ν°μ μκ° λ§μμ§ λ μ°μ° νμλ μΌλ§λ μ¦κ°νλκ°?'μ΄κ³ Big Oλ μκ³ λ¦¬μ¦μ΄ μ±λ₯μ΄ μ΅μ μΈ κ²½μ°λ₯Ό λνλ λ μ¬μ©νλ€.
λ°λΌμ ν΄λΉ μκ³ λ¦¬μ¦μ μ¬μ©νλ μ΄λ€ κ²½μ°μλ 보μ₯λλ μ±λ₯ νκΈ°λ²μ΄λ€.
μκ³ λ¦¬μ¦μ μ±λ₯?
μκ³ λ¦¬μ¦μ μ±λ₯μ 1. μ½λμ μ€ν μλ(μκ°)κ³Ό 2. μ½λ μ€ν μ νμν λ©λͺ¨λ¦¬μ μμΌλ‘ νκ°λλ€.
Big O νκΈ°λ²μΌλ‘λ μκ° λ³΅μ‘λμ κ³΅κ° λ³΅μ‘λλ₯Ό λΆμν μ μλ€.
- μκ° λ³΅μ‘λ: μ½λκ° μ€νλλλ° κ±Έλ¦¬λ μκ°
- μ λ ₯ λ°μ΄ν° κ°μ(n)κ° λμ΄λ μλ‘ μ»΄ν¨ν°κ° κ·Έ μμ μ μ²λ¦¬νλλ°λ μΌλ§λ μ€ν μκ°μ΄ λμ΄λ κΉ?
- κ³΅κ° λ³΅μ‘λ: μ½λκ° μ€νλλ©΄μ μ¬μ©λλ λ©λͺ¨λ¦¬ μ
- μ λ ₯ λ°μ΄ν° κ°μ(n)κ° λμ΄λ μλ‘ μΌλ§λ λ§μ μμ λ°μ΄ν°κ° λ©λͺ¨λ¦¬μ μ μ₯λμ΄μΌ ν κΉ?
μνμ μ μ
μνμ μΌλ‘ λνλΈ μ μλ λ€μκ³Ό κ°λ€. κ°μΈμ μΌλ‘ μ΄ μ μκ° λ§μ λ λ€.
f(n) = O(g(n)) iff there exist positive costants c and n0 such that f(n)≤ c·g(n) for all n, n≥nβ
λͺ¨λ n, n≥nβ μ λνμ¬ f(n)≤ c·g(n) λ₯Ό λ§μ‘±νλ μμ μμ c μ n0 κ° μ‘΄μ¬νλ©΄ f(n) = O(g(n)) μ΄λ€.
μ΄λ f(n) μ _g(n)_μ Big OλΌκ³ μ½λλ€.
μλ₯Ό λ€μ΄ _f(n)_κ³Ό _g(n)_μ΄ λ€μκ³Ό κ°λ€κ³ νμ. νκ°νλ €λ (μκ°λ³΅μ‘λ or 곡κ°λ³΅μ‘λ) ν¨μκ° _f(n)_μ΄κ³ , _g(n)_μ λΉκ΅ν ν¨μμ΄λ€.
f(n) = 3n+2
g(n) = n
μ΄λ 3nβ+2≤ cnβμ λ§μ‘±νλ c=4, nβ=2μ΄λ€. 쑰건μ λ§μ‘±νλ cμ nβμ΄ μμΌλ―λ‘ f(n) = 3n=2 = _O(n)_μ΄λ€.
μ¬κΈ°μ λλλ¬μ§λ Big O νκΈ°λ²μ νΉμ§μ
- μμνμ 무μνλ€.
_O(2n)_μ΄λ _O(3n+1)_μ΄λ _O(n)_μ΄λ€. - μ΅κ³ μ°¨νλ§ λ³Έλ€.
λ°μ΄ν° μ λ ₯ κ°μ nμ μν₯μ λ°μΌλ―λ‘ κ°μ₯ μν₯λ ₯μ΄ ν° μ΅κ³ μ°¨νλ§ λ³Έλ€.
_O(3n²+2n+1)_μ _O(3n²)_μΌλ‘, μ¬κΈ°μ _O(n²)_μΌλ‘ 보면 λλ€.
μλ κ·Έλνλ Big O νκΈ°λ²μμ μ£Όλ‘ μ¬μ©λλ νκΈ°λ€μ μ λ ₯ κ°μμ λ°λ₯Έ μ±λ₯ μ°¨μ΄λ₯Ό λνλΈ κ²μ΄λ€.

Big Oμμ μκ° λ³΅μ‘λλ₯Ό λ°μ§λ©΄ λ€μκ³Ό κ°λ€. g(n)μ΄ μμμ κ°κΉμΈμλ‘ ν¨μ¨μ΄ μ’λ€.
O(1) < O(log n) < O(n) < O(nlogn) < O(n²) < ...
μκ° λ³΅μ‘λ π½ ---------------μκ° λ³΅μ‘λ β«
μκ³ λ¦¬μ¦ μ±λ₯μ΄ λΉ¨κ°μμΌλ‘ λμ΄κ°λ€λ©΄ μμ μ΄ νμν κ²μ΄λ€.
μμμ μ€μ΅
μκ³ λ¦¬μ¦ κ°μμμ μ£Όλ‘ μ λ ¬κ³Ό νμ μκ³ λ¦¬μ¦μ μμλ‘ λ°°μ
κ·Έμ κ΄λ ¨λ μ€μν μ¬λ‘λ₯Ό κ°μ§κ³ μλ€.
O(n)
O(n)=f(n)=nμΌλ‘ O(n)μ νλμ© νμΈνλ μ ν μκ³ λ¦¬μ¦μ ν΄λΉνλ€.
μ΅μ μ κ²½μ° μ λ ₯ λ°μ΄ν° nκ°λ₯Ό λͺ¨λ νμΈνλ€.
μ€μν μμ

λμκ΄μμ 곡λΆμ νμν μ± μ λΉλ¦¬λ €κ³ νλλ°, λμκ΄μ μ± λ€μ΄ μμ§ μ 리λμ§ μμ μνμ΄λ€.
ν κΆμ© κΊΌλ΄ μ λͺ©μ νμΈνλ©° μ± μ μ°Ύλλ€.
μ΄μ΄ μλ€λ©΄, λμκ΄μ λͺ¨λ μ± nκ°λ₯Ό νμΈν΄μΌ νλ€.
μ΄λ° μμ νμμ μ ν νμμ΄λΌκ³ νλ€.
μ½λ
public class LinearSearch {
public static int linearSearch(String[] arr, String target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(target)) return i; // μ°ΎμΌλ©΄ μΈλ±μ€ λ°ν
}
return -1; // μ°Ύμ§ λͺ»ν κ²½μ°
}
public static void main(String[] args) {
String[] arr = {"μ½λ©μ μ΄ν΄", "κ°λ°μκ° λκ³ μΆμ΄?", "μ€νλ¦°νΈ",
"μκ³ λ¦¬μ¦ νν€μΉκΈ°","μλ£κ΅¬μ‘°μ μ μ"};
System.out.println(linearSearch(arr, "μ€νλ¦°νΈ")); // 2
}
}
O(log n)
μ€μν μμ

μ¬μ μμ μ΄λ€ λ¨μ΄λ₯Ό μ°ΎμΌλ €κ³ νλ€.
μ¬μ μ λΉμ°ν γ±γ΄γ·, νΉμ ABC μμλ‘ μ λ ¬λ μνλΌκ³ κ°μ νλ€.
μ²μλΆν° μ°Ύλ κ² μλλΌ μ€λ°λΆν° μ°Ύμκ°λ©° νμΈν΄μΌ νλ νμ΄μ§λ₯Ό μ λ°μ© μ€μΈλ€.
μλ₯Ό λ€μ΄ "Notation" λ»μ΄ κΆκΈνλ€λ©΄,
μΌλ¨ μ¬μ μμ μ€κ° νμ΄μ§μ λ¨μ΄μ Notationμ μνλ²³μ λΉκ΅νλ€.
nμ΄ λ·μͺ½μ μλ€λ©΄ μ΄μ μ€κ° νμ΄μ§μ λ·λΆλΆλ€λ§ νμΈνλ©΄ λλ€.
μ΄λ° μμΌλ‘ μ λ°μ© μ€μ¬λκ°λ€. μ΄λ¬ν νμμ μ΄μ§ νμμ΄λΌκ³ νλ€.
μ½λ
import java.util.Arrays;
public class DictionarySearch {
public static int binarySearchDictionary(String[] dictionary, String target) {
int left = 0, right = dictionary.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
int comparison = dictionary[mid].compareTo(target);
if (comparison == 0) return mid; // λ¨μ΄λ₯Ό μ°Ύμμ κ²½μ° μΈλ±μ€ λ°ν
else if (comparison < 0) left = mid + 1; // targetμ΄ μ¬μ μμΌλ‘ λ€μͺ½μ΄λ©΄ μ€λ₯Έμͺ½ νμ
else right = mid - 1; // targetμ΄ μ¬μ μμΌλ‘ μμͺ½μ΄λ©΄ μΌμͺ½ νμ
}
return -1; // λ¨μ΄κ° μ¬μ μ μλ κ²½μ°
}
public static void main(String[] args) {
String[] dictionary = {"algorithm", "data", "character", "map", "notation", "object", "public", "static"};
Arrays.sort(dictionary); // μ¬μ μ μ λ ¬λμ΄ μμ΄μΌ ν¨
String target = "notation";
int result = binarySearchDictionary(dictionary, target);
if (result != -1) {
System.out.println("λ¨μ΄ '" + target + "'λ μ¬μ μ " + result + "λ²μ§Έ μΈλ±μ€μ μμ΅λλ€.");
} else {
System.out.println("λ¨μ΄ '" + target + "'λ₯Ό μ°Ύμ μ μμ΅λλ€.");
}
}
}
+
μ μ λ°μ© μ€μ¬κ°λ κ²μ΄ O(log n)μΌκΉ?
1οΈβ£ ν λ¨κ³ μ§νν λλ§λ€ κ²μν νμ΄μ§ μκ° μ λ°μΌλ‘ μ€μ΄λ λ€.
μ¬μ μ μ΄ νμ΄μ§ μλ₯Ό nμ΄λΌκ³ νλ©΄,
- 첫 λ²μ§Έ λΉκ΅ ν n/2 κ°μ νμ΄μ§λ§ νμΈνλ©΄ λ¨
- λ λ²μ§Έ λΉκ΅ ν n/4 κ°μ νμ΄μ§λ§ νμΈνλ©΄ λ¨
- μΈ λ²μ§Έ λΉκ΅ ν n/8 κ°μ νμ΄μ§λ§ νμΈνλ©΄ λ¨
- kλ²μ§Έ λΉκ΅ ν n / 2α΅ κ°μ νμ΄μ§λ§ νμΈνλ©΄ λ¨
2οΈβ£ μΈμ κ²μμ΄ λλλμ§ κ³μ°
μ΄μ§ νμμ λ³΄ν΅ 1κ°μ νμ΄μ§λ§ λ¨μμ λ μ’ λ£νλ€.
n / 2α΅ = 1μ΄ λλ kλ₯Ό ꡬνκΈ° μν΄ μλ³μ logλ₯Ό μ μ©νλ©΄
logβn= k
μ¦, μ΄μ§ νμμ μ΅λ λΉκ΅ νμ kλ logβ(n) μ΄κ³
Big O νκΈ°λ²μ λ°λΌ O(log n)μ΄λ€.
O(nβlog n)
- λ³ν© μ λ ¬, ν΅ μ λ ¬, ν μ λ ¬ λ±μ΄ μνλ€.
κ·Έ μ€ λ³ν© μ λ ¬μ λ°°μ΄μ κ³μ λ°μΌλ‘ λλ ν, μ λ ¬λ μνλ‘ λ€μ ν©μΉλ 'λΆν μ 볡' μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
μ€μν μμ
λν μ μμμ μ μ²μμ μ λ§μ μ§μμμ μ±μ μ μ λ ¬ν΄μΌ νλ κ²½μ°
μ΄λ»κ² μ λ ¬ν κ²μΈκ°?
μ½λ
import java.util.Arrays;
public class MergeSort {
public static void mergeSort(int[] arr) {
if (arr.length < 2) return; // λ°°μ΄μ΄ νλ μ΄νμ μμλ§ μμΌλ©΄ μ λ ¬ν νμ μμ
int mid = arr.length / 2; // μ€κ° μ§μ
int[] left = Arrays.copyOfRange(arr, 0, mid); // μΌμͺ½ λΆλΆ λ°°μ΄
int[] right = Arrays.copyOfRange(arr, mid, arr.length); // μ€λ₯Έμͺ½ λΆλΆ λ°°μ΄
mergeSort(left); // μΌμͺ½ λ°°μ΄ μ λ ¬
mergeSort(right); // μ€λ₯Έμͺ½ λ°°μ΄ μ λ ¬
merge(arr, left, right); // μ λ ¬λ λ°°μ΄μ ν©μΉκΈ°
}
private static void merge(int[] arr, int[] left, int[] right) {
int i = 0, j = 0, k = 0;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) arr[k++] = left[i++]; // μμ κ°μ λ°°μ΄μ λ£κΈ°
else arr[k++] = right[j++];
}
while (i < left.length) arr[k++] = left[i++]; // λ¨μ μμ μΆκ°
while (j < right.length) arr[k++] = right[j++];
}
public static void main(String[] args) {
int[] arr = {10, 3, 8, 4, 7, 1, 2, 5, 9, 6};
mergeSort(arr);
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}
}
+
μ λ³ν© μ λ ¬μ O(nβlog n)μΌκΉ?
μμ λ§ν λΆν μ 볡 μκ³ λ¦¬μ¦κ³Ό κ΄λ ¨ μλ€.

μ λ°μ© λλλ λΆν μ μ΄μ§ νμμμ νμΈνλ―μ΄ O(log n)μ μκ°μ΄ νμνκ³ ,
λΆν μ νλμ μμκ° λ¨μ λκΉμ§ λ°μΌλ‘ λλλ―λ‘, nκ°μ λ°°μ΄μ΄ μκΈ°κ³ μ΄ μ λ ¬λ λ°°μ΄μ nλ² ν©μ³μΌ νλ€. λ°λΌμ ν©λ³μμ O(n)μ΄ μμλλ€.
μ΄ λμ κ³±ν΄ λ³ν© μ λ ¬μμλ O(nβlog n)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
π μ°Έκ³ μλ£
Thomas H. Cormen et al. "Introduction to Algorithms (3rd Edition)" (MIT Press, 2009)
λΉ μ€ νκΈ°λ² (big-O notation) μ΄λ
[μκ³ λ¦¬μ¦] μκ° λ³΅μ‘λμ Big O νκΈ°λ²