sck07013 2024. 9. 30. 13:24

검색의 개념

어떤 집합에서 원하는 것을 찾는 것

 

알고리즘의 종류

1. 순차검색

2. 이진 검색

 

#검색의 개념 :
    어떤 집합에서 원하는 개념을 찾는 것

 

#정렬되지 않은 집합의 순차 검색 원리와 구현
찾을 데이터를 집합의 맨 앞에서 부터 찾아가야한다
검색이 성공하는 경우 실패하는 경우로 나뉜다.

 

#클래스와 함수 선언 부분
#정렬되지 않은 데이터의 순차 검색
def seqSearch(ary, fData) :
    pos = -1
    size = len(ary)
    print('##비교한 데이터 ==>', end = ' ')
    for i in range(size) :
        print(ary[i], end = ' ')
        if ary[i] == fData :
            pos = i
            break
    print()
    return pos

#전역변수 부분
dataAry = [188, 150, 168, 162, 105, 120, 177, 50]
findData = 0

#메인 코드 부분
findData = int(input('*찾을 값을 입력하세요. -->'))
print('배열 -->', dataAry)
position = seqSearch(dataAry, findData)
if position == -1 :
    print(findData, ' (이)가 없네요.')
else :
    print(findData, '(은)는 ', position, '위치에 있음')
*찾을 값을 입력하세요. --> 150
배열 --> [188, 150, 168, 162, 105, 120, 177, 50]
##비교한 데이터 ==> 188 150 
150 (은)는  1 위치에 있음

 

#정렬된 데이터의 순차 검색
def seqSearch(ary, fData) :
    pos = -1
    size = len(ary)
    print('##비교한 데이터 ==>', end = ' ')
    for i in range(size) :
        print(ary[i], end = ' ')
        if ary[i] == fData :
            pos = i
            break
        elif ary[i] > fData :
            break
    print()
    return pos

#전역 변수 선언 부분
dataAry = [180, 150, 168, 162, 105, 120, 177, 50]
findData = 0

#메인 코드 부부
dataAry.sort()
findData = int(input('*찾을 값을 입력하세요. -->'))
print('배열 -->', dataAry)
position = seqSearch(dataAry, findData)
if position == -1 :
    print(findData, '(이)가 없네요')
else :
    print(findData, '(은)는', position, '위치에 있음')
*찾을 값을 입력하세요. --> 150
배열 --> [50, 105, 120, 150, 162, 168, 177, 180]
##비교한 데이터 ==> 50 105 120 150 
150 (은)는 3 위치에 있음

 

#이진 검색
시작 중앙 끝을 반복적으로 1/2씩 줄여가면서 계산하는 방식

 

#이진 검색의 구현
시작 = 0
끝 = 배열길이 - 1
while (시작 <= 끝)
    중앙 = (시작+끝) // 2
    if 찾는 값 == 중앙 :
        검색 성공. 중앙 위치 반환
    elif 찾는 값 > 중앙 :
        시작 = 중앙 + 1
    else :
        끝 = 중앙 - 1

while 문에서 중앙 위치를 반환하지 못하고, 여기까지 오면 실패

 

#정렬된 데이터의 이진 검색
#클래스와 함수 선언 부분
def binSearch(ary, fData):
    pos = -1
    start = 0
    end = len(ary) - 1

    while start <= end:
        mid = (start + end) // 2
        if fData == ary[mid]:
            return mid
        elif fData > ary[mid]:
            start = mid + 1
        else:
            end = mid - 1  

    return pos

# 전역 변수 부분
dataAry = [50, 60, 105, 120, 150, 160, 162, 168, 177, 188]
findData = 162

# 메인 코드 부분
print('배열 -->', dataAry)
position = binSearch(dataAry, findData)
if position == -1:
    print(findData, '(이)가 없네요.')
else:
    print(findData, '(은)는', position, '위치에 있음')