Binary Search
2020-1νκΈ°, λνμμ βμκ³ λ¦¬μ¦β μμ μ λ£κ³ 곡λΆν λ°λ₯Ό μ 리ν κΈμ λλ€. μ§μ μ μΈμ λ νμμ λλ€ :)
Binary Search
<μ΄λΆ νμ Binary Search>. μ΄λΆ νμμ μΈλ₯ μ§μ±μ κ°μ₯ μ§κ΄μ μ΄κ³ νμν λꡬλ€! μ λ§ κ°μΈμ μΈ μ견μΌλ‘ , μ΄ μκ³ λ¦¬μ¦μ΄ λ΄κ° λκ³ , λ΄κ° μ΄ μκ³ λ¦¬μ¦μ΄ λλ <λͺ°μμΌμ²΄ η©ζδΈι«> μμ€μ μ΄λ₯΄κΈ° μν΄ μ μ§ν΄μΌ ν μ λλ‘ βμΈμβμμ μ€μν μκ³ λ¦¬μ¦μ΄λΌκ³ μκ°νλ€.
μμ΄λμ΄λ κ°λ¨νλ€. βμ λ°μΌλ‘ μ€μ΄λ©° νμνκΈ°β. λλ μ΄κ±Έ <κ΄μ¬ μμ Interest Zone>μ μ³λΈλ€κ³ μ μνλ€. μΌμ’ μ <κ°μ§ μΉκΈ° Pruning>λΌκ³ μκ°νλ€λ λ§μ΄λ€. π΄
<λΆν μ 볡>κ³Όλ μ½κ° μ€νμΌμ΄ λ€λ₯΄λ€κ³ λ μκ°νλλ°, λΆν μ 볡μ λ¬Έμ λ₯Ό λΆν νκ³ μ΄νμ λ² μ΄μ€ μΌμ΄μ€λΆν° λ€μ μμμ¬λ €μΌ νμ§λ§, <μ΄λΆ νμ>μ μμμ¬λ¦¬λ κ³Όμ μμ΄ λΆν λ§ μννλ€.
ν¬μ€νΈμ λͺ©μ μ΄ μμ λ΄μ© μ 리λ μΌλ¨ μ 리λ₯Ό ν΄λ³΄μ!
Goal: Find a key $k$ in sorted order array.
λ¨Όμ target $k$λ₯Ό λ°°μ΄μ κ°μ΄λ κ°κ³Ό λΉκ΅νλ€. λΉκ΅ κ²°κ³Όμ λ°λΌ μ’μΈ‘ μ λ°μ μ·¨νκ±°λ μ°μΈ‘ μ λ°μ μ·¨νλ€. μ΄ν κ·Έ μ λ°μ λν΄μ λμΌν κ³Όμ μ λ°λ³΅νλ€!
<λΆν μ 볡>μ κ΄μ μμ λ³Ό λ, λ¨ νλμ subproblemμ΄ λ°μνκΈ° λλ¬Έμ $a=1$μ΄λ€. λ°λΌμ
\[T(n) = T(n/2) + O(1)\]<Master Theorem>μ μ μ©νμ. $a=1$, $b=2$, $c=0$μ΄λ―λ‘ $a/b^c = 1$μ΄λ€. λ°λΌμ
\[O(1) \cdot \log n = O(\log n)\]$\blacksquare$
λκ° μ΄λλ‘ ν¬μ€νΈλ₯Ό λλ΄κΈ°μ μμ¬μμ PSμμ νν νλ μ€μ μ€ νλμ λν΄ λ§ν΄λ³΄λ €κ³ νλ€.
Off-by-One
βThis problem could arise when a programmer makes mistakes such as using βis less than or equal toβ where βis less thanβ should have been used in a comparison.β - Wikipedia
μ΄λΆ νμμ ν¬ν¨ν, λλΆλΆμ λΆν μ 볡 λ¬Έμ μμ βOff-be-Oneβμ μ λ§ κ°λ°μλ₯Ό νλκ² νλ μ€μλ€!! νν, νλλ₯Ό λ ν¬ν¨νκ±°λ λ ν¬ν¨ν΄μ μκΈ°λ μ€μλ€ π±π±
λΆν μ 볡μ κ²½μ°, μ λ
ceil $\lceil x \rceil$μ μ·¨ν μ§, floor $\lfloor x \rfloor$λ₯Ό μ·¨ν μ§ ν·κ°λ¦¬λ κ²½μ°κ° λ§λ€. λλ, iteratoring κ³Όμ μμ arr[0]
μ ν¬ν¨ν μ§λ arr[last+1]
μ ν¬ν¨ν΄μΌ νλμ§ λ±λ± μ λ§ λ§μ λΆλΆμμ κ·Έ βνλβ λλ¬Έμ FAILμ λ°κ² λ§λ λ€.
λ³ΈμΈμ΄ μκ°νλ μ΄ μ€μλ₯Ό μ€μ΄λ λ°©λ²μ κ²°κ΅, <μκΈ° μμ¬ self-doubting>μ΄λ€. λΆν μ 볡μΌλ‘ μ κ·Όν λ, if
λ¬Έμ 쑰건μ μ λλ‘ μ΄ κ±΄μ§, μμ μ μμ¬νλ κ±°λ€. μ½κ² λ§νλ©΄ λμΆ© λμ΄κ°μ§ λ§κ³ κΌΌκΌΌν λ΄λΌλ λ§μ΄λ€.
μ΅κ·Όμ Off-by-One λλ¬Έμ μλ¬λ¦° λ¬Έμ κ° μμ΄μ λ§ν¬λ₯Ό κ±Έμ΄λλ€.
Binary Search - Code
Binary Searchλ₯Ό ꡬννλ μ€νμΌμ μ¬λ¬ κ°μ§κ° μλ€. κ·Έλ¦¬κ³ κ·Έ ꡬν μμ Binary Searchμμ μꡬνλ λν
μΌμ λ°λΌμ if
λ¬Έμ μ‘°κ±΄μ΄ μ½κ°μ© λ³κ²½λ μλ μλ€.
Binary Searchλ₯Ό ꡬννλ κΆκ·Ήμ ν νλ¦Ώμ΄ μλ 건 μλλΌκ³ μκ°νλ€. κ·Έλ¦¬κ³ λͺ¨λ μΌμ΄μ€μ λμνλ Binary Search ꡬνμ μΈμ°κΈ°λ λΆκ°λ₯νλ°, λ¬Έμ μμ μꡬνλ κ²½μ°κ° μλ λ€μνκΈ° λλ¬Έμ΄λ€.
λ€λ§, Binary Searchμ κΈ°λ³Έ μν μ λλ μμλλ©΄ μ’λ€.
Binary Search (Basic)
function binary_search(A, n, T) is
L := 0
R := n β 1
while L <= R do
m := floor((L + R) / 2)
if A[m] < T then
L := m + 1
else if A[m] > T then
R := m β 1
else:
return m
return unsuccessful
μ μ½λλ βμ λ ¬λ λ°°μ΄ $A$μμ target $T$μ indexλ₯Ό μ°Ύλλ€βλ Binary Searchμ λ³Έλ λͺ©μ μ μΆ©μ€ν μννλ μ½λλ€. νμ§λ§, λ°°μ΄μ μ€λ³΅λ μμκ° μμ΄ Target $T$μ leftmost index, rightmost indexλ₯Ό μ°Ύλ κ²μ λΆκ°λ₯νλ€. μ΄λ₯Ό μννλ €λ©΄ μ½λλ₯Ό λ§μ΄ μμ ν΄μΌ νλ€.
Binary Search (leftmost)
function binary_search_leftmost(A, n, T):
L := 0
R := n
while L < R:
m := floor((L + R) / 2)
if A[m] < T:
L := m + 1
else:
R := m
return L
λ§μ λΆλΆμ΄ λ°λμλ€. 첫 μμμμ $R$μ $n-1$μ΄ μλ $n$λΆν° μμνκ² λμκ³ , return κ° μμ $L$μ΄ λμλ€.
μ½λλ₯Ό κ²μ¦νκΈ° μν΄ μν©μ κ°μ ν΄λ³΄μ.
A = [1, 2, 3, 4, 4, 4, 6, 6, 7, 8] (n = 10)
1. $T=-1$
λ°°μ΄ $A$μ $-1$μ κ°μ μ‘΄μ¬νμ§ μλλ€. μ μ½λλ μ΄λ€ κ°μ λ±κ² λ κΉ? μ λ΅μ $0$μ΄λ€. νμ A[m] >= T
μ΄κΈ° λλ¬Έμ μ’
κ΅μλ μ΄κΈ°μ μ€μ ν $L$μ΄ return λλ€. κ·Έ κ°μ $0$μ΄λ€.
2. $T=10$
λ§μ°¬κ°μ§λ‘ λ°°μ΄ $A$μ $10$μ κ°μ μ‘΄μ¬νμ§ μλλ€. μ΄ κ²½μ° μ΄λ€ κ°μ λ±κ² λ κΉ? μ λ΅μ $10$μ΄λ€. νμ A[m] < T
μ΄κΈ° λλ¬Έμ μ’
κ΅μλ $L=10$, $R=10$μ΄ λκ³ , $L=10$μ΄ return λλ€.
3. $T=5$
λ°°μ΄ $A$μ $5$μ κ°μ μ‘΄μ¬νμ§ μλλ€. μ΄ κ²½μ° μ΄λ€ κ°μ λ±κ² λ κΉ? μ λ΅μ $5$ (A[5]=4
)μ΄λ€. μ΄λ, $5$λΌλ κ°μ query $T=5$μ <rank>λΌκ³ νλ€. μ¬κΈ°μ rankλ β# of smaller eltsβλΌλ μλ―Έλ‘ μ°μλ€. μ¦, leftmostλ₯Ό μ°Ύλ μμ μ½λλ₯Ό μ΄μ©ν΄μ λ°°μ΄ $A$ λ΄μμ queryμ βrankβμ predecessor/successor λ±λ±μ μ°Ύμ μ μλ€. Wikipediaμμλ μ΄κ²μ βApproximate MatchesβλΌλ νλͺ©μμ μκ°νκ³ μλ€.
Approximate Matches
<Approximate Matches>λ μ΄μ§ νμμ μμ©νλ κ°μ₯ λνμ μΈ λ°©λ²μ΄λ€! κ·Έλ¦¬κ³ μ΄μ§ νμμ λ¨μν <νμ> κΈ°λ²μΌλ‘λ§ μ¬μ©νλ κ²μ ν° μν΄λ€! π’
μ΄μ§ νμμ μ μ¬μ©νλ©΄, μλμ κ°μ μ’μ μ 보λ€μ μ°Ύμ μ μλ€.
- rank: the number of smaller elements
- predecessor: next-smallest element
- successor: next-largest element
- nearest neighbor
- range queries: seeking the number of elts btw two values
μμμλ μ΄ν΄λ΄€λ―μ΄ <rank>λ βleftmostβλ₯Ό μ°Ύλ μκ³ λ¦¬μ¦μ ν΅ν΄ μ½κ² ꡬν μ μλ€.
λ°λλ‘ <successor> queryλ βrightmostβλ₯Ό μ°Ύλ μκ³ λ¦¬μ¦μ ν΅ν΄ μ½κ² ꡬν μ μλ€!
<range query>λ κ° query $a \le b$μ λν΄μ $a$μ βleftmostβμ $b$μ βrightmostβλ₯Ό λλ€ μ°ΎμμΌλ‘μ¨ κ΅¬ν μ μλ€. μμμ μκ°ν [BAEKJOON] 10816λ² - μ«μ μΉ΄λ2 λ¬Έμ κ° λ°λ‘ $a=b$ μν©μμμ range queryλ₯Ό μννλ λ¬Έμ λ€!