μκ° λ³΅μ‘λ κ΄λ ¨ μ 리
λ§μ΄ μ°μ΄λ μκ° λ³΅μ‘λμ λν λΉκ΅μ΄λ€. xμΆ κΈ°μ€μΌλ‘ λλ΅ 1000κΉμ§μ λ²μμμ κ·Έλ¦° κ·Έλνμ΄λ€.
μμμ μ΄μΌκΈ°νλ O(n)
/ O(log n)
λ°μμ μ΄μΌκΈ°λ λ§μ΄ λ€μμ§λ§, κ·Έλμ μ€μ λ‘ μ΄λ»κ² μ°λμ§μ λν μ΄μΌκΈ°λ λ§μ΄ λΆλͺνλ³΄μ§ μμΌλ©΄ λλΌκΈ° μ΄λ ΅λ€. λ΄κ° λλλλ‘ μ 리ν΄λ³Έλ€. λΉμ°ν μ λμ μΈ κ²μ μλλ€.
μ¬λλ§λ€ λ§μ΄ λ§μλ°, λμΆ© μΌλ°μ μΈ μ¬μ©μ PC κΈ°μ€ μ΄λΉ 1μ΅
~ 10μ΅
κ°μ μ°μ° μ λλ₯Ό μ²λ¦¬ κ°λ₯νλ¨ κ²μ΄ μ€λ‘ μ΄λ€. λ¬Όλ‘ μ΄κ²μ λ무 λ―ΏμΌλ©΄ μλλκ², κΈ°λ³Έμ μΌλ‘ μ°μ°μ μ¬λμ΄ μ΄ line
λ¨μκ° μλλΌ μ΄μ
λΈλ¦¬ λ 벨μ instruction
λ λ²¨λ‘ λ΄μΌνκΈ° λλ¬Έμ΄λ€ λν, μ΄ instruction
μ μ΄μ
λΈλ¦¬λ‘ μ½λλ₯Ό λ³νν΄μ μ νν λͺκ°κ° μνλλμ§ μλ€κ³ ν΄λ, κ° instruction
λ§λ€μ μνμκ°μ΄ λμΌνμ§ μμΌλ©°, CPU
κ° prefetching
λ νκ³ , branch prediction
λ νκ³ , pipelining
λ νκΈ° λλ¬Έμ, λͺ¨λ μμλ₯Ό μκΈ°λ μ΄λ ΅λ€. μ νν μνμκ°μ΄λ 무쑰건 λΆλͺνλ΄μΌ μλ κ²(λν μνμ νμ κ°μ§ μλ€)μ΄λ€. νμ§λ§ μΌλ°μ μΌλ‘λ 보μμ μΌλ‘ 1μ΅
μ κΈ°μ€μ μΌλ‘ μ‘μ νκ³ , λ§μ½ μ΄λ₯Ό ν¬κ² λμ΄κ°μ§λ μμ κ²μΌλ‘(μ¦, 10μ΅ ν μ°μ° μ λλΌλ©΄) μμλλ€λ©΄ μμμ΅μ νλ₯Ό μλν΄λ³΄λ κ²μ΄ μ’μ κ²μ΄λ€.
λλ N
μ κ°μ λ°λΌ λλ΅ μλμ κ°μ κΈ°μ€μ μ°κ³ μλ€.
N <= 100
: O(N^3)
, μ΅μ νλ O(N^4)
μκ³ λ¦¬μ¦μ λ릴 μ μλ€.N <= 1,000
: O(N^2)
, μ£Όλ‘ DP
λ‘ νΈλ λ¬Έμ μμ λ§μ΄ μ¬μ©λλ λ²μμ΄λ€.N <= 10,000
: μ¬κΈ°λΆν΄ λλ΅ O(N^2)
λ timeout
λκΈ° μ½λ€. O(n log n)
μ λκ° νμ©λλ€κ³ λ΄μΌνλ€.N <= 100,000
: μλ§ λ¨μλ₯Ό λμ΄κ°λ©΄ μ¬μ¬ λΉ‘μΈλ€. O(N^2)
λ 무쑰건 timeout
λκΈ° μμνλ ꡬκ°. O(n log n)
μ λλ±, νΉμ κ·Έ μ΄μμ μκ³ λ¦¬μ¦μ μ¬μ©ν΄μΌ νλ€.N <= 1,000,000
: μ¬κΈ°λΆν°λ O(n)
μ μ¬μ¬ μ¨μΌνλ λ¨μμ΄λ€. O(n log n)
λ μ¬μ¬ μκ°μ΄ μμλλ κ²μ΄ λμ λ€μ΄μ€κΈ° μμνλ€.
O(n^1/2)
, O(n * n^1/2)
κΈ°λ²λ μμ£Ό λ±μ₯νλ μμ μ΄λΌλ κ²μ΄λ€. κΌ μμλμ.
N >= 1,000,000,000
: O(log n)
μ΄ κ°μ λλ€. O(n^1/2)
λ μ μ§λ©΄ λλ€.λ§μ€ν° μ 리
λΌκ³ λ λΆλ¦¬λ μ΄ μ΄λ‘ μ λ€μ μμμ μλ―Ένλ€. μ¬κ· κ΄κ³μμΌλ‘ ννν μκ³ λ¦¬μ¦μ μκ° λ³΅μ‘λλ₯Ό κ³μ°νλλ°μ μ°μΈλ€.
μλ°νλ μ λ μμκ³ , μ μ κ·Όμ μΌλ‘ μμΈ ν¨μλΌκ³ νλ€. μ λ¬Έμ ν¬κΈ°μ΄λ€. λΆν μ 볡μΌλ‘ λ¬Έμ ν¬κΈ° μΈ λ¬Έμ κ° μΈ κ°μ νμ λ¬Έμ λ‘ λλμ΄μ§λ€κ³ νλ©΄, κ°μ νμ λ¬Έμ λ κ°κ° μκ°μ ν μ μμ κ²μ΄λ€. μ΄ λ, λ¬Έμ λ₯Ό λλκ³ κ°κ°μ κ²°κ³Όλ₯Ό ν©μΉλλ° λλ λΉμ©μ΄ μ΄ λλ κ²μ΄λ€.
μ΄ λ, μ λ°λΌ μλμ²λΌ μκ° λ³΅μ‘λκ° κ³μ°λλ€.
μ μ΄λ‘ μ λ°λ₯΄λ©΄, Binary Searchμ μκ° λ³΅μ‘λλ₯Ό κ³μ°ν΄λ³Ό μ μλ€. μλμ²λΌ μ¬κ·λ‘ ꡬννλ€κ³ μκ°ν΄λ³΄μ.
int bs(int s, int e, int t) {int m = (s+e)>>1;if (arr[m] == t) return m;if (arr[m] > t) return bs(s,m-1);else return bs(m+1,e);}
μ΄ κ²½μ°, ν¨μμ μ§μ νλ©΄ 1κ°μ ν¨μλ‘ μͺΌκ°μ§λ€. μ¦, μΈ κ²½μ°μ΄λ€. μ΄ κ²½μ° μ΄κ³ , μ΄λ―λ‘, λλ²μ§Έ caseμ ν΄λΉνλ€. μκ° λ³΅μ‘λλ μ΄ λλ€.
μ΄ κ²½μ°μλ λ§μ°¬κ°μ§λ‘ μ¬κ·λ‘ ꡬνλλ€κ³ μκ°ν΄λ³΄μ. λλ΅μ μΈ ν¨μλ μλμ²λΌ λλ€.
// [s, e]void mergeSort(int s, int e) {if (s >= e) return;int m = (s+e)>>1;mergeSort(s, m); mergeSort(m+1, e);// μ΄ν μλ΅μ ν©μΉλ κ³Όμ ... μ 체 μμμ λν΄μ f(n) = O(n)μ΄ κ±Έλ¦°λ€.}
μ΄ κ²½μ°, ν¨μμ μ§μ νλ©΄ 2κ°μ ν¨μλ‘ μͺΌκ°μ§λ€. λν, ꡬκ°λ λ‘ μ€μ΄λ λ€. μ¦, μΈ κ²½μ°μ΄λ€. μ΄ κ²½μ°, μ΄κ³ , μ΄λ€. μ¦, λλ²μ§Έ caseμ΄λ€. μκ° λ³΅μ‘λλ μ΄ λκ² λ€.