Quick Selection
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :)
μμμ μ«μ λ°°μ΄μ΄ μμ λ $k$λ²μ§Έλ‘ μμ κ°μ μ°Ύλ κ²μ <Selection>μ΄λΌκ³ νλ€. 보ν΅μ κ²½μ° λ°°μ΄μ μ λ ¬ν νμ $k$λ²μ§Έ κ°μ μ ννλ©΄ λμ§λ§, ν΅ μ λ ¬μ μ΄λ€λ©΄ νκ· $O(n \log n)$ μ΅μ μ κ²½μ° $O(n^2)$μ λΉμ©μ΄ λ λ€. μ΄λ²μ λ€λ£° μκ³ λ¦¬μ¦μ μ λ ¬λμ§ μμ λ°°μ΄μμ $k$λ²μ§Έλ‘ μμ κ°μ λΉ λ₯΄κ² μ°Ύλ <Quick Selection>μ΄λ€. <Quick Selection>μ $O(n)$μ λΉμ©μΌλ‘ $k$λ²μ¬ κ°μ μ°Ύμ μ μλ€!
<Quick Selection>μ μμ΄λμ΄λ ν΅ μ λ ¬κ³Ό μ λ§ λΉμ·νλ€! <Quick Selection>λ pivotμ κ³ λ₯΄κ³ left, center, rightλ‘ λ°°μ΄μ λΆν νλ€.
- input: a list $S$ of numbers and an integer $k$
- output: The $k$-th smallest elt in $S$
Choose a number $v$ from $S$, split $S$ into 3 sublists w.r.t. $v$.
μ΄μ $S_L$, $S_v$, $S_R$μ ν¬κΈ°λ₯Ό κΈ°μ€μΌλ‘ μ¬κ· ν¨μλ₯Ό νΈμΆνλ€.
\[\text{selection}(S, k) = \begin{cases} \text{selection}(S_L, k) & \text{if} \quad k \le \left|S_L\right| \\ v & \text{if} \quad \left| S_L \right| < k \le \left|S_L\right| + \left|S_v\right| \\ \text{selection}(S_R, k - \left|S_L\right| -\left|S_v\right| ) & \text{if} \quad k > \left|S_L\right| + \left|S_v\right| \\ \end{cases}\]<Quick Selection> μκ³ λ¦¬μ¦μ κ°λ¨νμ§λ§ κ°λ ₯νλ€ π
<Quick Selection>μ μ£Όμν μ΄μλ κΈ°μ€μ΄ λλ $v$ κ°μ μ΄λ»κ² μ‘λλ μ΄λ€. λ§μ½ 맀 κ³Όμ λ§λ€ $v$λ₯Ό the smallest eltλ‘ μ‘μΌλ©΄ μ΅μ μ μΌμ΄μ€λ‘ $O(n^2)$μ λΉμ©μ΄ λ€κ² λλ€.
\[T(n) = T(n-1) + O(n) = O(n^2)\]μ¬μ€ μ’μ pivotμ μ‘κΈ° μν λ λ§μ κ³ μ°°λ€μ΄ μμ§λ§ μ΄λ² ν¬μ€νΈμμλ <Quick Selection>μ μμ΄λμ΄λ§ κ°λ¨ν μ€λͺ νκ³ λμ΄κ°λλ‘ νκ² λ€. pivotμ μ μ‘κ² λλ©΄ $O(n)$μ λΉμ©μ΄ λ¨μ μ¦λͺ ν μ μλ€. μλμ μν°ν΄μμ μ΄ λ΄μ©μ μ λ€λ£¨κ³ μμΌλ λ κΆκΈν μ¬λλ€μκ² μΆμ²νλ€.
π Quick Selection μκ³ λ¦¬μ¦
π Median of Medians μκ³ λ¦¬μ¦
μ°Έκ³ λ‘ C++μμλ <Quick Selection>μ ꡬνν νμμμ΄ nth_element()
ν¨μλ₯Ό μ¬μ©νλ©΄ λλ€ π