본문 바로가기

컴퓨터 공학/자료구조와 알고리즘

알고리즘 이진탐색(Binary Search) 그림으로 쉽게 이해하기

728x90
반응형

알고리즘 이진탐색(Binary Search) 그림으로 쉽게 이해하기

 

안녕하세요.

 

로스윗의 코딩캠프입니다.

 

오늘은 정렬 알고리즘 중에서

 

이진탐색(Binary Search)에 대한 포스팅을 진행하겠습니다.

 

정말 어렵지 않으니 잘 따라와주세요!!

 

 

 

 

 

우선 저희가 이번 포스팅에서 배울 이진탐색(Binary search)은 

 

이후에 배울 정렬과는 조금 다른 내용이기는 합니다.


하지만 정렬을 공부하기 전에 먼저 이진탐색(binary search)에 대해서 이해하고 있어야

 

이후의 내용을 공부할 때 좀 더 수월하기 때문에

 

이진탐색(Binary search)에 대해서 먼저 다뤄보도록 하겠습니다.

 

 

 

 

-이진 탐색(Binary Search)이란?

이진탐색(Binary search)이란

 

-> 오름차순 정렬되어 있는 리스트 내에서 특정값의 인덱스를 찾는 알고리즘 입니다.

 

예시를 한 번 보겠습니다.

 

 

이진탐색 예시
이진 탐색 예시


1부터 20까지의 숫자리스트에서 

 

숫자 7의 위치가 몇 번째의 인덱스 위치에 들어있는지 찾기 위한 가장 효율적인 방법은 무엇일까요?


숫자가 정렬되어 있는 것은 보장이 되어 있지만

 

이때 이 안에 있는 숫자들이 모두 연속된 숫자임을 의미하지는 않습니다.


보시면 아시겠지만 중간에 건너뛴 숫자들이 존재해요. 

 

그렇기 때문에 숫자 7의 값을 찾기 위해서 꼭 7번째 인덱스 위치에 숫자가 있지 않을 수 있습니다.


그래서 이 상황에서 우리는 가장 효율적으로 숫자를 찾는 방법을 생각해야 합니다.

 


물론 리스트의 처음부터 끝까지 쭉 값을 하나씩 비교해보면서 값을 찾는 방법도 있지만 

 

이 방법은 데이터의 크기가 커질수록 비효율적이겠죠.


- 그렇다면 효율적인 방법은 무엇일까요?

우선 리스트에서 가장 중간에 위치한 인덱스의 값을 먼저 찾아갑니다.


그렇다면 가장 중간에 위치한 값은 11인걸 알수 있죠. 

 

 

중간 값 11
가장 중간 값은 11

 

그리고 이 배열은 정렬이 되어 있다는 조건이 붙어있기 때문에


11보다 작은 값은 무조건 11보다 왼쪽에 있을 것이고, 11보다 큰 값은 무조건 오른쪽에 있을 것입니다. 


그러면 우리가 찾아야 하는 값 7은 11보다 작기 때문에 11의 왼쪽 리스트만 찾으면 그 중 어딘가에 7이 있을거에요.


이때 11역시도 우리가 찾는 값이 아니기 때문에

 

굳이 11까지 포함해서 보지 않아도 11이 위치한 바로 앞에 인덱스 위치까지만 보면 되겠죠.


그럼 여기서도 앞에서 한 동작을 동일하게 적용해볼게요.


우리가 데이터를 절반으로 줄여서 얻은 이 리스트에서 중간 인덱스에 위치한 값은 5입니다.

 

 

그 다음 중간 값은 5
그 다음 중간 값은 5


마찬가지로 5의 왼쪽에는 5보다 작은 값들이 있을거구요, 5의 오른쪽에는 5보다 큰 값이 있을거에요.

 

우리가 찾고자 하는 값 7은 5는 5보다 크기 때문에 5의 오른쪽에 있겠죠.

 

그래서 여기서도 5를 포함하지 않고 7~10까지의 새로운 서브 리스트를 찾아낼 수 있습니다.

 

여기서도 동일 동일하게 중간값 9를 가져옵니다

 

그 다음 중간값은 9
그 다음 중간값은 9

 

우리가 찾고자하는 값 7이 9보다 큰지 작은지를 비교해서 값의 위치를 찾아나갈 수 있습니다.


이것이 Bicary search즉 이진탐색입니다. 


Binary 뜻 자체가 숫자 둘을 의미합니다.

 

 한 번의 수행마다 절반씩 둘로 나뉘어 가면서 사이즈를 줄여나가기 때문에 

 

Binary search라고 이름이 붙게 되었습니다.

 

 

- 이진탐색(Bicary Search)의 특징

그래서 이진탐색(Binary search)는 한 번의 시행마다 우리가 봐야할 데이터의 크기가

 

절반씩 훅훅 줄어든다는 특징이 있어요.


그래서 밑이 2인 logN번만 분할하면 데이터 리스트의 값을 찾아오는게 가능하기 때문에 

 

logN의 시간 복잡도를 갖게 됩니다.


시간 복잡도 O(N)과 비교했을 때 어느정도의 차이가 있냐면 

 

총 데이터가 100개인 리스트가 주어졌다고 가정 했을 때


앞에서부터 하나씩 값을 비교하면서 데이터를 찾게 된다면 최대 100번의 연산 수행을 해야하는 반면 


이진탐색(Binary search)로 값을 찾게 된다면 어떤 경우라도 6.64번, log100의 값이죠. 

 

이것을 자연수로하면 최대 7번 내에는 값을 찾을 수 있다는 의미가 됩니다.


데이터의 크기가 더 커질수록 이 수행의 크기 차이는 더 커지겠죠.


그렇다면 우리가 그동안 구현했던 자료구조에서 index of라는 method를 구현했던 것을 기억하시나요?


이걸로 원소의 위치를 찾기 위해 이진탐색(Binary search)를 적용하면

 

더 빨리 값을 찾을 수 있는게 아닌가 하는 생각을 해볼 수 있어요.


하지만 이진탐색(binary search)는 정렬된 리스트에서만 사용이 가능하다는 제약이 존재하기 때문에

 

데이터의 값이 정렬되어 있다는 보장이 되어 있지 않다면 쓸 수 없는 방법이라는 조건이 함께 따라옵니다.

 

로스윗의 코딩캠프는

 

미래의 개발자 여러분을 응원합니다.

 

모두 화이팅!!

 

자료구조 - 해시(Hash)란? (ft. 가장 쉬운 비유 설명)

 

자료구조 해시(Hash)란? (ft. 가장 쉬운 비유 설명)

자료구조 해시(Hash)란? (ft. 가장 쉬운 비유 설명) 안녕하세요. 로스윗의 코딩캠프입니다. 오늘은 자료구조 중에서 중요한 해시(Hash)에 대한 강의를 진행하도록 하겠습니다 정말 어렵지 않으니 잘

rosweet-ai.tistory.com

자료구조 스택(stack)이란? (ft. 그림으로 쉽게 설명)

 

자료구조 스택(stack)이란? (ft. 그림으로 쉽게 설명)

자료구조 스택(stack)이란? (ft. 그림으로 쉽게 설명) 안녕하세요. 로스윗의 코딩캠프입니다. 오늘은 자료구조 중에서 중요한 스택에 대해서 같이 알아보겠습니다. - 스택이란? -> 스택은 후입선출

rosweet-ai.tistory.com

 

728x90
반응형