binary search
TRANSCRIPT
Python이민석국민대학교 컴퓨터공학부
http://sw4all.tistory.com/
Binary Search & …
이민석국민대학교 컴퓨터공학부
http://sw4all.tistory.com/
학습 목표1. 데이터 정렬 잠깐 remind2. 정렬된 데이터에서 원하는 내용 찾기
(Binary Search – 이진 탐색 )
Naver ‘ 핫토픽 키워드’
2015 년 5 월 9 일 오전 8 시 , 11 시 , 14 시
세상의 많은 문제의 본질은 ...
• 데이터 사이의 관계를 이해하는 것데이터의 순서
정렬 (Sorting) : 어떤 기준이든 .
데이터의 소속 분류 (Categorizing) 및 인식 : 어떤 구분이든 .
데이터의 연관성 관계 (Relation) 의 설정 : 어떤 이유이든 .
데이터의 변화 추세 (Trend) 의 확인 : 어떤 관점이든 .
데이터의 정렬 방식• Simple sorts
Insertion sort Selection sort
• Efficient sorts Merge sort Heap sort Quick sort
• Bubble sort and variants Bubble sort Shell sort Comb sort
• Distribution sort Counting sort Bucket sort Radix sort
• …
문제는 다 같다 : 데이터를 순서대로 정렬하는 것답은 다르다 :데이터의 모양에 따라서
http://en.wikipedia.org/wiki/Sorting_algorithm
정렬이 된 (sorted) 것들
[a .. zzz]
[ 갈홍기 .. 황희민 ]
오늘은 , 찾아보는 겁니다 .
본질적으로 균일한 index 로 찾기
50 페이지 셋째줄내용과 상관없이
“ 몇번째” 에 있는지 이미 알면탐색 없이 바로 접근
BUT, 그러나
“ 독도” 단어 찾기
“ 독도” 단어 찾기
list = [ 세종실록지리지의 모든 단어를 차례로 나열] for s in list : if (s == “ 독도” ) : print(“ 발견” )
‘ 통밥’ 아니면앞에서 부터 차례로 찾는 것 이외에는 다른 대안이 없다 .
우연히 , 내가 찾는 단어 (item) 가 제일 첫 단어 일 수도 있고재수가 없으면 , 제일 마지막 단어 일 수도 있다 .
단어 수가 100 개라면 평균 50 번을 비교해야 찾는다 .
그래서 우리는 ,
목차 ( 주제 별 )
( 단어 알파벳 순 ) 인덱스
키워드로 페이지 (index) 를 얻은 후 ,바로 접근
그리고 , HyperLink 도 만들고 ..
사람이 , 사전에서 단어 찾기
[a .. zzz]인간은 ‘통밥’에 능하다 (1,2,3) - 통밥은 경험에 의한 가상의 index 에 의존하지만 인간은 detail 에 약하다 . (4)
1. “ 감”을 동원하여 적당한 곳을 펼친다 .2. 찾는 단어의 더 앞에 있는지 뒤에 있는지 확인하고3. 한두번 더 펼쳐본다 .4. 거의 근처에 왔으므로 한장씩 넘겨본다5. 단어가 있는 페이지를 찾은 뒤에 ,6. 페이지 안의 단어를 1~5 방식으로 ( 하지만 아주 빠르게 ) 찾는다
정렬된 사전에서 .. 컴퓨터가 같은 일을 하도록 해야한다면 ..
list = [ 세종실록지리지의 모든 단어를 차례로 나열 ] for s in list : if (s == “ 독도” ) : print(“ 발견” )
어쨋거나적어도 이거보다는 나아야 ..
‘ 컴퓨터가’ 의 의미 : 가상적인 인덱스 ( 경험에 의한 단어 분포의 이해 ) 를 알지 못한다는 의미
짜잔 , Binary Search ( 이진 탐색 )
크다 작다 게임에 답을 맞추는 것과 같은 방식“A 가 1~1000 까지 숫자를 하나 생각하고 , B 가 아무런 사전정보 없이 맞추는 게임독심술 초능력을 가지지 않은 B 의 Best 작전은 , 반씩 잘라가는 거 .
500750
875……
625
250 375125
최악의 경우log2( 후보개수 ) 번의 실패
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 97966
이진 탐색• 문제 : 정렬된 (sorted) 리스트 x 에서 x[i] = “ 찾는 값”인 i 를
찾는 것 ( 또는 그런 i 가 없다는 것을 확인하는 것 )
– Ex, 사전에서 “ Dog” 이란 단어를 찾는 것 결과 : page, 컬럼 , 라인– Ex, 가나다 순 학생 명부에서 “홍길동”을 찾는 것 결과 : 학생의 학번
• Ex. 아래에서 13 찾기
15
99
max
16
2
min
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 중간위치 8 선택
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 13 < 53, 실패
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 중간위치 3 선택
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 13 < 14, 또 실패
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min
중간위치 1 선택
21 3 4 5 …0
…1413 25 336
max
2
min
6 < 13, 또 실패21 3 4 5 …0
…1413 25 336
minmax
2
성공 !
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 97966
이진 탐색• 문제 : 정렬된 (sorted) 리스트 x 에서 x[i] = “ 찾는 값”인 i 를 찾는
것 ( 또는 그런 i 가 없다는 것을 확인하는 것 )
– Ex, 사전에서 “ Dog” 이란 단어를 찾는 것 결과 : page, 컬럼 , 라인– Ex, 가나다 순 학생 명부에서 “홍길동”을 찾는 것 결과 학생의 학번
• Ex. 아래에서 94 찾기
15
99
max
16
2
min
( 없음 )
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 중간위치 8 선택
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min 53 < 94, 실패
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min
중간위치 12 선택821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
93 < 94, 실패
821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 9796615
99
max
16
2
min
min
min
… 109 11 12 1413
64… 8472 93 95 979615
99
max
16
min
중간위치 14 선택
… 109 11 12 1413
64… 8472 93 95 979615
99
max
16
min
94 < 96, 실패
… 109 11 12 1413
64… 8472 93 95 979615
9916
minmax앗 , 94 != 95, 실패
찾을 값
시작은 중간 위치부터
같지 않으면 , min, max 위치 조정 후새로운 중간 지점 지정
실행 결과
프로그래밍 팁 :
• 리스트가 위 처럼 생겼을 때 (2 진 탐색 프로그램을 작성한 경우 )–어떤 숫자를 찾아 내는 ( 또는 못찾았다고 하는 ) Test 를 해야하며–리스트의 처음 숫자인 2, 마지막 숫자인 99 가 잘 찾아지는 지를 꼭
확인(Boundary Condition Test)
• 프로그래밍 tip = 사람이 ‘무의식적으로’ 생각하는 방법간격이 1m 인 기둥이 한 줄로 세개 서 있다 , 첫번째 기둥과 세번째 기둥의 거리는 ?
정렬이 된 (sorted) 것들
[a .. zzz]
[ 갈홍기 .. 황희민 ]
Python 에서의 사전 (dict)
요약1. 데이터 정렬 잠깐 remind2. 정렬된 데이터에서 원하는 내용 찾기
(Binary Search – 이진 탐색 )3. Python 의 사전 데이터 형 : dictionary
http://sw4all.tistory.com/