binary search

32
Python 이이이 이이이이이 이이이이이이 http://sw4all.tistory.

Upload: minsuk-lee

Post on 17-Jan-2017

411 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Binary search

Python이민석국민대학교 컴퓨터공학부

http://sw4all.tistory.com/

Page 2: Binary search

Binary Search & …

이민석국민대학교 컴퓨터공학부

http://sw4all.tistory.com/

Page 3: Binary search

학습 목표1. 데이터 정렬 잠깐 remind2. 정렬된 데이터에서 원하는 내용 찾기

(Binary Search – 이진 탐색 )

Page 4: Binary search
Page 5: Binary search

Naver ‘ 핫토픽 키워드’

2015 년 5 월 9 일 오전 8 시 , 11 시 , 14 시

Page 6: Binary search

세상의 많은 문제의 본질은 ...

• 데이터 사이의 관계를 이해하는 것데이터의 순서

정렬 (Sorting) : 어떤 기준이든 .

데이터의 소속 분류 (Categorizing) 및 인식 : 어떤 구분이든 .

데이터의 연관성 관계 (Relation) 의 설정 : 어떤 이유이든 .

데이터의 변화 추세 (Trend) 의 확인 : 어떤 관점이든 .

Page 7: Binary search

데이터의 정렬 방식• 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

Page 8: Binary search

정렬이 된 (sorted) 것들

[a .. zzz]

[ 갈홍기 .. 황희민 ]

Page 9: Binary search

오늘은 , 찾아보는 겁니다 .

Page 10: Binary search

본질적으로 균일한 index 로 찾기

50 페이지 셋째줄내용과 상관없이

“ 몇번째” 에 있는지 이미 알면탐색 없이 바로 접근

Page 11: Binary search

BUT, 그러나

“ 독도” 단어 찾기

Page 12: Binary search

“ 독도” 단어 찾기

list = [ 세종실록지리지의 모든 단어를 차례로 나열] for s in list : if (s == “ 독도” ) : print(“ 발견” )

‘ 통밥’ 아니면앞에서 부터 차례로 찾는 것 이외에는 다른 대안이 없다 .

우연히 , 내가 찾는 단어 (item) 가 제일 첫 단어 일 수도 있고재수가 없으면 , 제일 마지막 단어 일 수도 있다 .

단어 수가 100 개라면 평균 50 번을 비교해야 찾는다 .

Page 13: Binary search

그래서 우리는 ,

목차 ( 주제 별 )

( 단어 알파벳 순 ) 인덱스

키워드로 페이지 (index) 를 얻은 후 ,바로 접근

Page 14: Binary search

그리고 , HyperLink 도 만들고 ..

Page 15: Binary search

사람이 , 사전에서 단어 찾기

[a .. zzz]인간은 ‘통밥’에 능하다 (1,2,3) - 통밥은 경험에 의한 가상의 index 에 의존하지만 인간은 detail 에 약하다 . (4)

1. “ 감”을 동원하여 적당한 곳을 펼친다 .2. 찾는 단어의 더 앞에 있는지 뒤에 있는지 확인하고3. 한두번 더 펼쳐본다 .4. 거의 근처에 왔으므로 한장씩 넘겨본다5. 단어가 있는 페이지를 찾은 뒤에 ,6. 페이지 안의 단어를 1~5 방식으로 ( 하지만 아주 빠르게 ) 찾는다

Page 16: Binary search

정렬된 사전에서 .. 컴퓨터가 같은 일을 하도록 해야한다면 ..

list = [ 세종실록지리지의 모든 단어를 차례로 나열 ] for s in list : if (s == “ 독도” ) : print(“ 발견” )

어쨋거나적어도 이거보다는 나아야 ..

‘ 컴퓨터가’ 의 의미 : 가상적인 인덱스 ( 경험에 의한 단어 분포의 이해 ) 를 알지 못한다는 의미

Page 17: Binary search

짜잔 , Binary Search ( 이진 탐색 )

크다 작다 게임에 답을 맞추는 것과 같은 방식“A 가 1~1000 까지 숫자를 하나 생각하고 , B 가 아무런 사전정보 없이 맞추는 게임독심술 초능력을 가지지 않은 B 의 Best 작전은 , 반씩 잘라가는 거 .

500750

875……

625

250 375125

최악의 경우log2( 후보개수 ) 번의 실패

Page 18: Binary search

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

Page 19: Binary search

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

Page 20: Binary search

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

Page 21: Binary search

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

성공 !

Page 22: Binary search

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

( 없음 )

Page 23: Binary search

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

Page 24: Binary search

중간위치 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

Page 25: Binary search

… 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, 실패

Page 26: Binary search

찾을 값

시작은 중간 위치부터

같지 않으면 , min, max 위치 조정 후새로운 중간 지점 지정

Page 27: Binary search

실행 결과

Page 28: Binary search

프로그래밍 팁 :

• 리스트가 위 처럼 생겼을 때 (2 진 탐색 프로그램을 작성한 경우 )–어떤 숫자를 찾아 내는 ( 또는 못찾았다고 하는 ) Test 를 해야하며–리스트의 처음 숫자인 2, 마지막 숫자인 99 가 잘 찾아지는 지를 꼭

확인(Boundary Condition Test)

• 프로그래밍 tip = 사람이 ‘무의식적으로’ 생각하는 방법간격이 1m 인 기둥이 한 줄로 세개 서 있다 , 첫번째 기둥과 세번째 기둥의 거리는 ?

Page 29: Binary search

정렬이 된 (sorted) 것들

[a .. zzz]

[ 갈홍기 .. 황희민 ]

Page 30: Binary search

Python 에서의 사전 (dict)

Page 31: Binary search

요약1. 데이터 정렬 잠깐 remind2. 정렬된 데이터에서 원하는 내용 찾기

(Binary Search – 이진 탐색 )3. Python 의 사전 데이터 형 : dictionary

Page 32: Binary search

http://sw4all.tistory.com/