본문 바로가기

자료구조 알고리즘

이진 탐색

STL 에서 이진탐색을 제공하고 있음

이진 탐색(binary search)

배열에 데이터가 정렬되어 있을 때 

 

탐색 자체는 O(logn) 이다. 빠름

 

특정 숫자가 배열에 있는지 찾는다면,

배열의 중간 배열부터 시작해서 탐색한다.

 

정렬되어 있는 배열을 배열의 중간 인덱스로 재귀 속성을 가지고 탐색한다.

정렬된 연결 리스트로는 불가하다. [] 를 이용한 임의 접근이 불가능해서임

 

배열 자체가 중간 삽입/삭제가 느리기 때문에 해당 값의 인덱스를 찾아도 거기서 해당 값을 삭제하거나 없을 시 삽입 하면 그때는 시간복잡도 O(n) 으로 느리게 반응하는 단점이 생긴다.

 

그래서 데이터의 변경까지 빠르게 하기 이해서 이진 탐색 트리를 사용한다.

밑은 이진 탐색을 반복문과 재귀로 구현한 것

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> numbers;

// 몇 번째에 위치하는지 반환
int BinarySearch(int n)
{
	int left = 0;
	int right = numbers.size() - 1;

	// left right = 0 일 때 혹은 size 일때 마지막까지 봐야해서 <=
	while (left <= right)
	{
		int mid = (left + right) / 2;

		if (n > numbers[mid])
		{
			left = mid + 1;
		}
		else if (n < numbers[mid])
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return numbers.size();
}

// 재귀
int BinarySearch2(int n, int l, int r)
{
	if (l > r)
	{
		return numbers.size();
	}
	int left = l;
	int right = r;
	int mid = (left + right) / 2;

	if (n == numbers[mid])
	{
		return mid;
	}

	if (n < numbers[mid])
	{
		BinarySearch2(n, left, mid - 1);
	}
	else
	{
		BinarySearch2(n, mid + 1, r);
	}

	
}

int main()
{
	numbers = vector<int>{ 1,2,3,4,5,6,7,8,9,10,11,12 };
	//cout << BinarySearch(12) << endl;
	cout << BinarySearch2(14, 0, numbers.size() - 1) << endl;



	return 0;
}

 

'자료구조 알고리즘' 카테고리의 다른 글

선택 정렬  (0) 2024.05.30
버블 정렬  (0) 2024.05.30
길찾기4 A* 알고리즘  (0) 2024.05.29
길찾기3 다익스트라 길찾기  (0) 2024.05.29
길찾기2 BFS 를 이용하기  (0) 2024.05.29