2020-1ν•™κΈ°, λŒ€ν•™μ—μ„œ β€˜μ•Œκ³ λ¦¬μ¦˜β€™ μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 지적은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€ :)

2 minute read

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() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€ πŸ™Œ

Categories:

Updated: