티스토리 뷰

Programming/자료구조

자료구조 - 검색

RosyPark 2019. 9. 30. 11:38

 

 

 

1. 순차검색

- 배열이 정렬되어 있지 않거나, 연결 리스트와 같이 입력이 동적으로 할당되는 경우 사용 

 

* 배열이 정리 안되어 있을 때 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pytest
 
 
def sequential_search(seq,n):
    for item in seq:
        if item == n:
            return True
 
    return False
 
 
 
def test_sequential_search():
    seq = [1,5,6,8,3]
    n1 = 5
    n2 = 7
    assert(sequential_search(seq,n1) is True)
    assert(sequential_search(seq,n2) is False)
 
 
if __name__ == "__main__":
    test_sequential_search()
 
 
cs

 

 

============================= test session starts =============================
platform win32 -- Python 3.6.9, pytest-5.2.0, py-1.8.0, pluggy-0.13.0
rootdir: F:\python_code\highperformancepythoncollected 1 item

ch_10.py .테스트통과! 
                                                               [100%]

============================== 1 passed in 0.02s ==============================

 

<NOTE> 

- 파이썬 구문에서 if 안에 return True가 맞으면 def 함수 끝네 return False라고 해도 True로 반환된다.

 

 

 

 

 

 

*배열 정리 되었을 때 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pytest
 
 
def sequential_search(seq,n):
    for item in seq:
 
        if item >  n:
           return False
 
        if item == n:
            return True
 
    return False
 
 
 
def test_sequential_search():
    seq = [1,2,4,5,6,8,10]
    n1 = 10
    n2 = 7
    assert(sequential_search(seq,n1) is True)
    assert(sequential_search(seq,n2) is False)
    print("테스트통과! ")
 
 
if __name__ == "__main__":
    test_sequential_search()
 
 
cs

 

============================= test session starts =============================
platform win32 -- Python 3.6.9, pytest-5.2.0, py-1.8.0, pluggy-0.13.0
rootdir: F:\python_code\highperformancepythoncollected 1 item

ch_10.py .테스트통과! 
                                                               [100%]

============================== 1 passed in 0.01s ==============================

 

 

<NOTE>

- * 배열이 정리 안되어 있을 때 , * 배열이 정리 안되어 있을 때  실행시간이 같다 .

 

 

2. 이진검색 

- 정렬된 배열 내에서 지정된 입력값의 위치(키)를 찾는다.

- 이진 검색은 알고리즘의 각 단계에서 입력값과 배열 중간요소를 비교한다.

- 입력값과 중간요소가 일치한다면, 배열 중간요소를 비교한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#재귀함수
def binary_search_rec(seq, target, low, high):
    if low > high:
        return None
    mid = (low + high) // 2
    if target == seq[mid]:
        return mid
    elif target< seq[mid]:
        return binary_search_rec(seq,target,low,mid-1)
    else:
        return binary_search_rec(seq,target,mid+1,high)
 
 
 
#반복문
def binary_search_iter(seq,target):
    high, low = len(seq), 0
    while low < high:
        mid = (high + low) // 2
        if target == seq[mid]:
            return mid
        elif target < seq[mid]:
            high = mid
        else:
            low = mid + 1
    return None
 
 
 
def test_binary_search():
    seq = [1,2,5,6,7,10,12,12,14,15]
    target = 6
    assert(binary_search_iter(seq,target) == 3)
    assert(binary_search_rec(seq,target,0,len(seq)) == 3)
    print("테스트 통과 ")
 
 
if __name__ == "__main__":
    test_binary_search()
cs

 

<NOTE>

* 재귀함수의 장단점

장점  단점

1. 가독성이 좋다

2. 변수 사용을 줄여준다. 

1. 메모리를 많이 차지하며 성능이 반복문에 비해 느림

- 재귀 함수 사용시 함수를 반복적으로 호출하기 때문에 스택 메모리가 커지고, 호출하는 횟수가 많아지면 스택오버플로우 발생 

 

 

2.1 bisect 모듈

- 파이썬의 내장 bisect 모듈로 이진 검색을 할 수 있음 

1
2
3
4
from bisect import bisect
= [0,3,4,5]
print(bisect(l,5)) #4
 
cs

 

<출처> 

1. 재귀함수를 쓰는 이유 - 블로그 

2. 파이썬 자료구조와 알고리즘, 미아스타인

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함