본문 바로가기
Code/ALGORITHM

탐색

by jaeaemin 2021. 8. 4.

리스트 내에서 데이터를 매우 빠르게 탐색하는 이진 탐색 알고리즘은 종류에 따라 상황에 맞게 사용하면 시간적&공간적 효율을 가져다 줄 수 있다.

 

순차 탐색

리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차레대로 확인하는 방법이다.

 

  • 정렬되어 있지 않은 데이터에 대해서 탐색을 진행할 때 효율적이다
  • 리스트 내 데이터가 아무리 많아도 시간이 충분하다면 항상 원하는 원소를 찾을 수 있다는 장점이 있다.
  • 리스트에 특정 값이 있는지 순차적으로 조사하기 체크하여 찾기 때문에 구현이 간단하다.
  • 리스트 자료형의 Count() 메서드는 내부적으로 순차탐색을 통해서 수행이 된다.
  • 가장 앞에 있는 원소부터 하나씩 확인하므로 시간 복잡도는 O(N)이다.

 

순차 탐색 소스코드 ( py )
def sequential_search( n, target, array):
    for i in range(n) :    # 각 원소 n까지 모두 탐색
          if array[i] == target:
                    return  i + 1        # 인덱스 위치 반환 ( 1부터 시작)

print(" 생성할 원소 개수와 찾을 문자열 입력하시오 ")
input_data = input().split()
n = int(input_data[0])
target = input_data[1]

print("앞서 적은 원소 개수만큼 문자열을 입력하시오, 구분은 띄워쓰기")
array =input.split()

print(sequential_search(n, target, array))


>>> 생성할 원소 개수와 찾을 문자열 입력하시오 
>>> 3 dog
>>> 앞서 적은 개수만큼 문자열을 입력하시오, 구분은 띄워쓰기
>>> cat dog duck
2

 

 

 

 

 

이진 탐색

 

리스트 내부 데이터가 정렬되어 있다면 Up/Down 게임과 같이 범위를 좁혀가면서 탐색하는 방법이다.

 

  • 데이터가 정렬되어 있어야 이진탐색이 가능하다.
  • 찾으려는 데이터의 ( 시작점,  끝점,  중간점  ) 을 통해서 데이터의 범위를 구분짓는다.
  • 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복해서 비교하여 알맞는 범위로 이동하면서 탐색한다.
  • 탐색을 한번 진행하여 범위를 교체할 때 마다 원소의 개수가 절반씩 줄어들기 때문에 시간 복잡도는 O(logN)이다.
  • 재귀함수로 구현하거나 반복문을 통해서 구현할 수 있다.

 

 

재귀함수로 구현한 이진탐색 코드 (py)

 

def binary_search(array, target, start, end):
       if start  >  end:
            return None

       mid = (start + end) // 2   #중간점 구하기
       
       if array[mid] == target:       # 중간점이  찾는 값일 때
           retrurn mid

       elif  array[mid]  >  target:    # 중간값보다 찾는값이 작을때 , 재귀할 때 시작부터 ~ 중간보다 작은값으로 재귀
           return binary_search(array, target, start, mid - 1)

       else:  # 반대로
           return binary_search(array, target, mid + 1, end)


n, target = list(map(int, input().split()))
array = list(map(int, input().split()))

result = binary_search(array, target, 0, n-1 )

if result == None:
    print("원소가 존재하지 않음")
else:
    print(result + 1)

 

 

 

반복문으로 구현한 이진탐색 코드 (py)

 

def binary_search(array, target, start, end):
       while  start  <=  end:
                mid = ( start + end ) // 2 

       if array[mid] == target:       # 중간점이  찾는 값일 때
                retrurn mid

       elif  array[mid]  >  target:    # 중간값보다 찾는값이 작을때 , end를 중간값의 이전 값으로 조정함
                end = mid -1
       else:  # 반대로 중간값이 작을 때 , start값을 중간값 이후 값으로 조정함
                start = mid + 1

 

반응형

'Code > ALGORITHM' 카테고리의 다른 글

최단 경로 알고리즘 (2)  (0) 2021.09.06
최단 경로 알고리즘  (0) 2021.09.01
다이나믹 프로그래밍  (0) 2021.08.12
정렬  (0) 2021.08.05
Greedy  (0) 2021.07.25