6. 세상의 많은 문제의 본질은...
• 데이터 사이의 관계를 이해하는 것
데이터의 순서
정렬 (Sorting) : 어떤 기준이든.
데이터의 소속
분류 (Categorizing) 및 인식 : 어떤 구분이든.
데이터의 연관성
관계 (Relation)의 설정 : 어떤 이유이든.
데이터의 변화
추세(Trend)의 확인 : 어떤 관점이든.
7. 데이터의 정렬 방식
• 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
12. “독도” 단어 찾기
list = [세종실록지리지의 모든 단어를 차례로 나열]
for s in list :
if (s == “독도”) :
print(“발견”)
‘통밥’ 아니면
앞에서 부터 차례로 찾는 것 이외에는 다른 대안이 없다.
우연히, 내가 찾는 단어(item)가 제일 첫 단어 일 수도 있고
재수가 없으면, 제일 마지막 단어 일 수도 있다.
단어 수가 100개라면 평균 50번을 비교해야 찾는다.
13. 그래서 우리는,
목차 (주제 별)
(단어 알파벳 순) 인덱스
키워드로 페이지(index)를 얻은 후,
바로 접근
15. 사람이, 사전에서 단어 찾기
[a .. zzz]
인간은 ‘통밥’에 능하다 (1,2,3)
- 통밥은 경험에 의한 가상의 index에 의존
하지만 인간은 detail에 약하다. (4)
1. “감”을 동원하여 적당한 곳을 펼친다.
2. 찾는 단어의 더 앞에 있는지 뒤에 있는지 확인하고
3. 한두번 더 펼쳐본다.
4. 거의 근처에 왔으므로 한장씩 넘겨본다
5. 단어가 있는 페이지를 찾은 뒤에,
6. 페이지 안의 단어를 1~5 방식으로 (하지만 아주 빠르게) 찾는다
16. 정렬된 사전에서.. 컴퓨터가 같은 일을 하도록 해야한다면..
list = [세종실록지리지의 모든 단어를 차례로 나열]
for s in list :
if (s == “독도”) :
print(“발견”)
어쨋거나
적어도 이거보다는 나아야..
‘컴퓨터가’ 의 의미: 가상적인 인덱스 (경험에 의한 단어 분포의 이해) 를 알지 못한다는 의미
17. 짜잔, Binary Search (이진 탐색)
크다 작다 게임에 답을 맞추는 것과 같은 방식
“A가 1~1000까지 숫자를 하나 생각하고, B가 아무런 사전정보 없이 맞추는 게임
독심술 초능력을 가지지 않은 B의 Best 작전은, 반씩 잘라가는 거.
500
750
875
…
…
625
250
375
125
최악의 경우
log2(후보개수) 번의 실패
18. 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
21. 821 3 4 65 7 109 11 12 14130
641413 25 33 5147 53 8472 93 95 97966
15
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
min
max
2
성공 !
22. 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
(없음)
28. 프로그래밍 팁:
• 리스트가 위 처럼 생겼을 때 (2진 탐색 프로그램을 작성한 경우)
– 어떤 숫자를 찾아 내는 (또는 못찾았다고 하는) Test를 해야하며
– 리스트의 처음 숫자인 2, 마지막 숫자인 99가 잘 찾아지는 지를 꼭 확
인
(Boundary Condition Test)
• 프로그래밍 tip = 사람이 ‘무의식적으로’ 생각하는 방법
간격이 1m 인 기둥이 한 줄로 세개 서 있다, 첫번째 기둥과 세번째 기둥의 거리는?