3. -업무 분담
조장: 김 현호
자료 조사: 김 창헌, 김 정무, 서 상현
프로그래밍: 최 고봉
-일정
6/12 업무분담 및 알고리즘 조사
6/14 사용할 알고리즘 채택 및 알고리즘 공부
6/19 소스 비교 후 제일 나은 것 선택
4. 자료 조사 및 문제 파악
-자료조사
*Heap
자료구조 Heap과 유형 max/min-Heap의 차이점
1. Priority를 갖는 자료구조, Heap의 개요
가. Heap의 정의
- 여러 개의 노드들 가운데서 가장 큰 키 값을 가지는 노드나 가장 작은 키 값을 가지는 노드
를 빠른 시간 내에 찾아내도록 맊들어진 자료 구조
나. Heap의 특징
- 완전 이진 트리의 하나로서 각각의 노드는 유일한 키 값을 가짐
- Priority Queue로서, 이는 말 그대로 Queue는 Queue이되 우선순위를 가진 Queue임
- 노드의 값이 중복가능
2. Heap의 유형 max-Heap, min-Heap의 차이점
1) max-Heap
: 부모노드의 키 값이 자식노드의 키 값보다 작지 않은 완전이진 트리(complete binary
tree)
2) min-Heap
: 부모노드의 키 값이 자식노드의 키 값보다 크지 않은 완전이진 트리(complete binary
tree)
5. 3. Heap 연산
- REMOVE-MAX 연산: 트리에 포함된 값들 중 가장 큰 값을 반환 및 삭제.
- INSERT 연산: 트리에 새로운 값을 포함
*Hash
Hashing은 하나의 문자열을 원래의 것을 상징하는 더 짧은 길이의 값이나 키로 변환하는 것이
다. 짧은 해시키를 사용하여 항목을 찾으면 원래의 값을 이용하여 찾는 것보다 더 빠르기 때문
에. 해싱은 데이터베이스내의 항목들을 색인하고 검색하는데 사용된다.
6. 해시 테이블-레코드의 저장을 위한 자료구조로써 해상함수로부터 계산된 함수값에 해당하는
위치에 각 레코드를 한 개 이상 보관할 수 있는 버켓들로 구성된 기억 공간이며, 주어진 key값
을 가지고 해당 레코드를 빠르게 검색하기 위한 수단을 제공하며 레코드의 삽입과 삭제를 용이
하게 한다.
버켓-해싱 함수에 의해 계산된 주소인 홈 주소 혹은 버켓 주소에 레코드 키를 저장하기 위해
마련된 기억장소를 말하며, 대개 한 개 또는 여러 개의 레코드를 저장할 수 있는 슬롯으로 구
성된다.
제산법-나머지 연산자를 사용하여 테이블 주소를 걔산하는 방법으로, 레코드 키 값을 수치 자
료로 간주하여 어 양의 정수로 나눈 나머지를 홈 주소로 결정하는 가장 간단한 해싱 함수이
다. 버켓주소 = 키 값% 해쉬테이블 크기
제곱법-제곱법은 레코드 키 값을 제곱한 후에 결과 값의 중간 부분에 몇 비트를 선택하여 해
시 테이블의 홈 주소로 사용하여, 심볼 테이블 응용에서 자주 사용된다.
제곱된 결과의 중간 비트는 대개 레코드의 모든 문자에 의존하므로, 레코드를 구성하는
몇 개의 문자가 같을지라도 서로 다른 레코드 키는 다른 홈 주소를 갖게 될 확률이 높다.
홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에 따라 달라지는데, 중간 부분의
자릿수를 n이라 하면 각 레코드 값들이 가지는 범위인 해시 테이블의 크기는 2^n이 된다.
*Deap 클래스
DEAP(double-ended heap)은 힙(heap) 구조로서 이중 우선 순위 큐(double-ended priority
queue)의 일종입니다. 즉, STL에 있는 prority_queue와 비슷한 기능을 합니다. 이 자료구조의
목적은 크기가 서로 다른 여러 자료가 있을 때, 이중 가장 큰 것이나 가장 작은 것을 순서대로
빠르게 가져오는 것입니다. 이를 구현한 자료 구조로 min heap과 max heap이 각 층별로 번갈
아가며 있는 Min-max heap도 있으나, 두 heap을 서로 따로 둔다는 아이디어를 가지고 구현
한 DEAP이 더 직관적이며 구현하기도 더 재미있습니다.
링크드 리스트, 트리, 해쉬 정도는 MFC에도 구현돼 있을 정도로 친근한 자료 구조이지만, 자
료 구조 책의 뒷부분 무렵에 나오는 힙 같은 것은 대개 낯설어 보입니다. 하지만 이것들은 의
외로 매우 유용합니다. 자료 삽입, 최대값 얻기, 최소값 얻기 작업을 모두 log n만에 할 수 있
습니다. 더구나 값을 얻으면서 이 자료를 삭제하는 데 걸리는 시간이 log n이지 값 자체를 얻
는 시간은 상수입니다. 이 n은 자료의 크기가 아니라 힙의 크기이기 때문에, 수십만 개의 자료
가 실시간으로 들어오고 있고, 이중에서 가장 중요한 100개의 자료만을 추려낸다고 할 때, 자
료를 모두 메모리로 읽어 정렬하지 않고도 100칸의 배열 안에서 이 일을 할 수 있지요.
이 프로그램의 CDeap은 DEAP을 템플릿 클래스로 구현한 것으로, 랭킹 기능에 맞게 만들어져
7. 있습니다. 이미 힙이 꽉 차 있으면 원소를 삽입할 때 어떡할 것인지 policy를 지정할 수 있습
니다. 큰 구조체를 대상으로 이 클래스를 쓸 경우, TYPE에는 A를, ARG_TYPE에는 const A
&와 같은 자료형을 주면 됩니다.
Deap이 일반 heap과 다른 점은?
deap은 한 배열로 min heap과 max heap을 동시에 표현합니다. 흔히 힙 정렬을 할 때나 일반
힙을 표현할 때, 맨 꼭대기의 인덱스를 0이 아닌 1로 삼는 경우가 있습니다. (배열의 포인터에
다 1을 뺌으로써) deap은 꼭대기에 원소가 두 개가 있기 때문에 인덱스를 2부터 시작하게 하
는 게 유리합니다. 이렇게 하면 어느 인덱스에서나 그 인덱스 번호에 2를 곱함으로써 아래층
왼쪽의 원소를 가리키게 할 수 있습니다.
즉, 2 [3], 4 5, [6 7], 8 9 10 11 [12 13 14 15], ... 의 순서대로 [] 안의 수치는 max
heap의 인덱스이고 그렇지 않은 2, 4, 5, 8, ...은 min heap의 인덱스가 되는 것입니다. max
heap의 인덱스는 그 수에서 가장 큰 2진법 비트와 그 다음 비트가 언제나 1임을 알 수 있습니
다. 3=11, 6=110, 13=1101, 15=1111
deap에 원소가 추가되면 처음에는 새 원소가 일반 heap과 마찬가지로 배열의 가장 마지막 인
덱스에 있게 됩니다. 그 인덱스는 min heap 인덱스일 수도 있고 max heap 인덱스일 수도 있
습니다.
이제 이 원소와, min이든 max이든 맞은편 heap에서 같은 위치에 있는 원소와 비교를 해야 합
니다. 8 ↔ 12, 7 ↔ 5와 같은 식입니다. 만약 정확하게 같은 위치에 있는 인덱스가 존재하지
않는다면 그 인덱스의 부모 인덱스에 있는 원소와 비교하면 됩니다. 가령, 원소가 min heap에
속하는 10번 인덱스와 짝인 max heap의 인덱스는 14인데 원소가 그만치 없어서 이 인덱스가
존재하지 않는다면 부모인 7번 인덱스가 짝이 되는 것입니다.
그래서 새 원소가 min heap에 추가됐는데 max heap의 짝이 새 원소보다 값이 작은 경우, 또
는 반대로 새 원소가 max heap에 추가됐는데 min heap의 짝이 새 원소보다 큰 경우 원소의
위치를 뒤바꿉니다. 그러고 나서 새 위치를 기준으로 새로운 원소가 min heap에 속한다면 min
heap대로, 혹은 max heap에 속한다면 max heap대로 해당 힙의 정의에 맞게 새 원소와 부모
원소를 재배치하면 삽입 작업이 끝납니다.
한편 삭제는 min 또는 max 원소를 대상으로 할 수 있는데, 해당 힙의 맨 꼭대기 원소를 제거
한 후 아래의 원소들 중 그 힙의 조건에 맞는 원소를 하나씩 끌어올려 줍니다. 그러면 맨 마지
막 빈 자리가 남게 되죠. 거기에다가 배열상으로 제일 마지막 인덱스에 해당하는 원소를 삽입
해서 위에서 열거한 삽입 작업(자기 짝과 위치 교환 등)을 다시 시행해 주면 됩니다.
http://moogi.new21.org/src15.htm
-문제 파악
1. 영어 텍스트 파일을 읽어서 사전을 검색하여 철자를 검색하는 프로그램을 작성한다.
2. 철자를 검색하여 틀린 글자가 나오면 표시하고 가장 적절한 단어를 추천한다.
3. 가장 적절한 단어를 찾기 위해서는 Edit distance를 사용하면 된다. 물론 다른 방법도 있다.
8. 4. 사용 가능한 사전
-알고리즘 계획
주어진 사전을 읽어드려 그 사전을 트리로 만들고 모든 노드에 널값을 넣고 입력받는 문자에
해당하는 노드에 카운트를 한다. 출력은 카운트된 값과
-소스 구현
-잘된 점
각자가 한번씩 소스에 대한 연구를 해 보았기 때문에 좀더 심도 깊은 회의가 될 수 있었다.
-잘 못된 점
모두가 각자의 프로그램을 짜다가 가장 좋은 것을 선택 하기로 했다보니 완성된 소스가 나오지
않고 모두 다 부족한 소스가 나왔기에 최종적으로 완성을 하지 못 하였다.