Binary-Search
π« Binary-Search
μ΄μ§νμ, μ΄λΆνμ.
μ λ ¬λ 리μ€νΈμ λν΄, νΉμ μμλ₯Ό Log N μμ μ°Ύμλ΄λ μκ³ λ¦¬λ¬
π« Use
- μ νλ²νΈλΆμμ μ΄λ¦μ΄ Kλ‘ μμνλ μ¬λμ λ²νΈ μ°ΎκΈ°
- μ±
νκ°μ΄λ°λ₯Ό νΌμΉκ³ μ°ΎκΈ° μμνλ λ°©λ²
- μνλ²³ μμλλ‘λΌλ©΄ μ€κ°μ―€μ Kλ‘ μμνλ μ΄λ¦μ΄ μμ ν λκΉ
- μ±
νκ°μ΄λ°λ₯Ό νΌμΉκ³ μ°ΎκΈ° μμνλ λ°©λ²
- μ¬μ μμ λ¨μ΄ μ°ΎκΈ°
- νμ΄μ€λΆμ λ‘κ·ΈμΈνκΈ° (νμ΄μ€λΆμ΄ λ΄ κ³μ μ΄ μ€μ‘΄νλ κ³μ μΈμ§ νμΈνκΈ° μν΄ λ°μ΄ν°λ² μ΄μ€μμ μμ΄λ μ°ΎκΈ°)
π« μ Why
Updown κ²μ.
μ²μλΆν° λκΉμ§ μ«μ νλνλ μμλλ‘ κ²μ¦νλ κ² λ³΄λ€λ, λ μ’μ λ°©λ².
νμ | μκ° | μ€λͺ |
---|---|---|
μ ννμ | O(n) | 리μ€νΈμ μ²μλΆν° λκΉμ§ μμ°¨μ μΌλ‘ νμ |
μ΄μ§νμ | O(log n) | μ λ ¬λ 리μ€νΈμμ νμ λ²μλ₯Ό μ λ°μ© μ€μ¬κ°λ©° νμ |
- 리μ€νΈμ μ«μ Nκ° μλ€λ©΄
- μ ννμ: μ΅μ μ κ²½μ° Nκ°μ μ«μλ₯Ό λͺ¨λ νμΈν΄μΌ ν¨.
- μ΄μ§νμ: μ΅μ μ κ²½μ° logNλ§ νμΈνλ©΄ λ¨.
- if N = 1,024
- μ ννμ: μ΅μ μ κ²½μ° 1,024
- μ΄μ§νμ: μ΅μ μ κ²½μ° log21,024 = 10
π« ꡬν
𫧠찾λ κ°μ΄ νλ
low/high (or start/end).
μ°Ύκ³ μ νλ κ°μ΄ ν¬ν¨λμ΄ μμ κ±°λΌκ³ μμνλ λ²μ.
(κ°μ΄ 리μ€νΈ μ체μ μμ μλ μκΈ° λλ¬Έμ μμ λ²μ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int binarySearch(int arr[], int target, int size)
{
// μ²μμλ λͺ¨λ λ²μλ₯Ό νμ
int low = 0;
int high = size - 1;
// μλ‘ μμΉκ° μμ λλ©΄, μμ λ²μκ° μλ€λ κ².
while (low <= high)
{
// μ λ°μ© λ²μλ₯Ό μ€μ¬ λκ°λ
// νμμΌ κ²½μ°μλ λ΄λ¦Ό
int mid = (low + high) / 2;
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
𫧠찾λ κ°μ΄ μ¬λ¬ κ°
μ΄λΆ νμ ν μ°Ύμ μμΉμμ μ μμΌλ‘ νμ₯ν΄λ λμ§λ§,
μ΅μ
μ κ²½μ° O(N)μ΄ λ μ μμ. (μ λΆ λ€ κ°μ κ°μΌ κ²½μ°)
λμ ,
κ°μ₯ λ§μ§λ§μ λμ€λ κ°μ μΈλ±μ€ - κ°μ₯ λ¨Όμ λμ€λ κ° μΈλ±μ€ + 1 = κ°μ
λ€λ₯΄κ² μκ°νλ©΄,
μ°Ύκ³ μ νλ κ°μ μ½μ
νμ λ μ€λ¦μ°¨μμ΄ μ μ§λλ μμΉλ₯Ό μ°Ύλ κ².
μ€λ¦μ°¨μμ΄ μ μ§λλ κ°μ₯ μ€λ₯Έμͺ½ μμΉ - μ€λ¦μ°¨μμ΄ μ μ§λλ κ°μ₯ μΌμͺ½ μμΉ = κ°μ
κ°μ₯ λ¨Όμ λμ€λ κ°μ μΈλ±μ€
= μ½μ
νμ λ μ€λ¦μ°¨μμ΄ μ μ§λλ κ°μ₯ μΌμͺ½ μμΉ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int lowerBound(int arr[], int target, int size)
{
int low = 0;
int high = size;
while (low < high)
{
int mid = (low + high) / 2;
if (arr[mid] >= target)
high = mid;
else
low = mid + 1;
}
return low;
}
κ°μ₯ λ§μ§λ§μ λμ€λ κ°μ μΈλ±μ€
= μ½μ
νμ λ μ€λ¦μ°¨μμ΄ μ μ§λλ κ°μ₯ μ€λ₯Έμͺ½ μμΉ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int upperBound(int arr[], int target, int size)
{
int low = 0;
int high = size;
while (low < high)
{
int mid = (low + high) / 2;
if (arr[mid] > target)
high = mid;
else
low = mid + 1;
}
return low;
}
π« λ©λͺ¨
- C++ STL
binary_search
ν¨μ- 리μ€νΈκ° λ°λμ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λμ΄ μμ΄μΌ ν¨.
- μμ μ 무λ₯Ό true/falseλ‘ λ°ν
lower_bound
ν¨μ- μ°Ύκ³ μ νλ κ° μ΄μμ΄ μ²μ λνλλ μμΉ
upper_bound
ν¨μ- μ°Ύκ³ μ νλ κ° μ΄κ³Όκ° μ²μ λνλλ μμΉ
equal_range
ν¨μlower_bound
μupper_bound
λ₯Ό ν λ²μ νΈμΆpair
λ‘ λ°ν
- Parametric Search μ²λΌ STLκ° λμμ΄ μλκ³ μ§μ μ΄λΆνμμ ν΄μΌνλ κ²½μ°κ° μλ€.
- 무ν 루νμ λΉ μ§λ κ²½μ°κ° μκΈ° λλ¬Έμ μ£Όμ
- 무ν 루νμ λΉ μ§μ§ μμΌλ €λ©΄
- μ€λ²νλ‘μ° λ°©μ§:
int mid = low + (high - low) / 2;
- κ· λ±νκ² λλκΈ°:
mid = (high - low + 1) / 2;
- μ€λ²νλ‘μ° λ°©μ§:
- TODO: μ’ν μμΆ ~