π Binary search
π μ΄μ§ νμ(Binary search)
π― μ΄μ§ νμμ΄λ?
- μ λ ¬λ λ°°μ΄μ΄λ 리μ€νΈμμ νΉμ κ°μ ν¨μ¨μ μΌλ‘ μ°Ύλ μκ³ λ¦¬μ¦μ΄λ€.
- μ΄μ§ νμμ λ°μΌλ‘ λλμ΄κ°λ©° κ²μμ μ§ννκΈ° λλ¬Έμ μκ° λ³΅μ‘λκ° λ§€μ° λΉ λ₯΄λ€(O(logn))μ μκ° λ³΅μ‘λ, μ¦ λ°°μ΄μ ν¬κΈ°κ° μ»€μ Έλ νμ νμκ° κΈκ²©ν μ¦κ°νμ§ μμ μ μλ―Ένλ€.
π‘ μ΄μ§ νμμ μλ μ리
- λ°°μ΄ μ λ ¬
- μ΄μ§ νμμ **λ°λμ μ λ ¬λ λ°°μ΄** μμλ§ μλνλ€
- μ€μκ° κ³μ°
- λ°°μ΄μ μ€μμ μλ κ°μ νμΈνλ€. κ·Έ κ°μ΄ μ°Ύκ³ μ νλ κ°μ΄λΌλ©΄ νμ μ’ λ£
- κ° λΉκ΅
- μ°Ύκ³ μνλ κ°μ΄ μ€μκ°λ³΄λ€ ν¬λ©΄, νμ λ²μλ₯Ό μ€μκ°μ μ€λ₯Έμͺ½ μ λ°μΌλ‘ μ€μ
- μ°Ύκ³ μνλ κ°μ΄ μ€μκ°λ³΄λ€ μμΌλ©΄, νμ λ²μλ₯Ό μ€μκ°μ μΌμͺ½ μ λ°μΌλ‘ μ€μ
- μ¬κ·μ νΉμ λ°λ³΅μ νμ
- λ°°μ΄μ λ²μκ° μ’μμ§ λκΉμ§ μ΄ κ³Όμ μ λ°λ³΅, λ μ΄μ μ°Ύμ κ°μ΄ μμΌλ©΄, μ°Ύμ§ λͺ»νλ€λ κ²°κ³Όλ₯Ό λ°ν(λ³΄ν΅ -1)
π» μ΄μ§ νμ μμ
#include <iostream>
using namespace std;
int binary_search(const vector<int>& arr, int target) {
int low = 0;
int high = arr.size() - 1; // indexμ ν¬κΈ°
while(low<=high)
{
int mid = low + (high - low) / 2 //μ€κ°κ° κ³μ°(μ€λ²νλ‘μ° λ°©μ§)
if(arr[mid] == target)
{
return mid; // μ€μκ°κ³Ό μ°Ύκ³ μ νλ κ°μ΄ κ°μΌλ©΄ midλ₯Ό 리ν΄
}
else if(arr[mid] < target)
{
low = mid + 1; // λ°°μ΄μ μ€μκ°μ΄ μ°Ύκ³ μ νλ κ°λ³΄λ€ μμΌλ©΄ λ μ€λ₯Έμͺ½μ μλ€λ λ»μ΄λκΉ νμ λ²μλ₯Ό μ€λ₯Έμͺ½μΌλ‘ μ’νλ€.
}
else
{
high = mid - 1; // λ°°μ΄μ μ€μκ°μ΄ μ°Ύκ³ μ νλ κ°λ³΄λ€ ν¬λ©΄ μΌμͺ½μ μλ€λ λ»μ΄λκΉ νμ λ²μλ₯Ό μΌμͺ½μΌλ‘ μ’νλ€.
}
}
return -1; //μ°Ύμ§ λͺ»νλ€λ©΄ -1 리ν΄
}
int main()
{
vector<int> arr = {1, 3, 5, 7, 9, 10};
int target = 7;
int result = binary_search(arr, target);
if(result == -1)
{
cout << "μ°Ύμ§ λͺ»ν¨!" << endl;
}
else
{
cout << "μ°Ύμ!" << result << endl;
}
return 0;
}
π» μ΄μ§ νμμ μ¬κ·μ ꡬν
#include <iostream>
#include <vector>
int binarySearchRecursive(const std::vector<int>& arr, int target, int low, int high) {
if (low > high) return -1; // κ°μ μ°Ύμ§ λͺ»νμ κ²½μ°
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
return mid; // κ°μ΄ μ€κ°κ°κ³Ό μΌμΉνλ©΄ κ·Έ μΈλ±μ€λ₯Ό λ°ν
} else if (arr[mid] < target) {
return binarySearchRecursive(arr, target, mid + 1, high); // μ€λ₯Έμͺ½ μ λ°μΌλ‘
} else {
return binarySearchRecursive(arr, target, low, mid - 1); // μΌμͺ½ μ λ°μΌλ‘
}
}
int main() {
std::vector<int> arr = {1, 3, 5, 7, 9, 11, 13, 15};
int target = 7;
int result = binarySearchRecursive(arr, target, 0, arr.size() - 1);
if (result != -1) {
std::cout << "Element found at index: " << result << std::endl;
} else {
std::cout << "Element not found" << std::endl;
}
return 0;
}
π μ΄μ§ νμμ μ£ΌμνΉμ§
- μκ° λ³΅μ‘λ
- (O(logn)) λ‘, νμ λ²μκ° μ λ°μ© μ€μ΄λ€κΈ° λλ¬Έμ λ§€μ° λΉ λ₯΄λ€.
- κ³΅κ° λ³΅μ‘λ
- (O(1)) (λ°λ³΅λ¬Έ μ¬μ©μ), μ¬κ· νΈμΆμ μ¬μ©νλ©΄ νΈμΆ μ€νμ΄ νμνλ―λ‘ (O(logn)) μ΄ λ μλ μλ€.
- μ λ ¬λ λ°°μ΄μμλ§ λμ
- binary search μμ κ°μ₯ μ€μν μ΄λ‘
- μ΄μ§ νμμ μ¬μ©νλ €λ©΄ λ°°μ΄μ΄λ 리μ€νΈκ° λ°λμ μ λ ¬λμ΄ μμ΄μΌνλ€.
- λ§μ½ μ λ ¬λμ΄ μμ§ μλ€λ©΄, λ¨Όμ μ λ ¬μ ν΄μΌνλ€.
- μ νν κ°μ μ°Ύμ§ λͺ»νμ κ²½μ°
- κ°μ μ°Ύμ§ λͺ»νμ κ²½μ° μΌλ°μ μΌλ‘ β-1β μ λ°ννλ€. λλ nullptr(ν¬μΈν°μΌ κ²½μ°)λ₯Ό λ°ννλ€.
π μ 리
μ΄μ§ νμμ μ½λ© ν μ€νΈμ κΌ νμν κ°λ μ΄λ€. νμ μλκ° λΉ λ₯Έλ§νΌ 무쑰건 μ λ ¬λ λ°μ΄ν° μμλ§ μ¬μ© κ°λ₯μ΄λΌλ μ‘°κ±΄μ΄ λΆμ΄μλ€.