1 / 63

5. 화일의 정렬 / 합병

5. 화일의 정렬 / 합병. Contents. 다단계 합병 (Polyphase Merge) 2- 원 다단계 합병의 예 초기 런 분배 방법 3- 원 다단계 합병 3- 원 다단계 합병의 예 M- 원 다단계 합병 알고리즘 계단식 합병 (Cascade Merge) 3- 원 계단식 합병 M- 원 계단식 합병 알고리즘 정렬 / 합병 유틸리티 사용자 정의 사항 정렬 / 합병의 예 저장 장치와 정렬 / 합병. 파일 정렬 합병의 개요 파일 정렬 / 합병 정렬 단계 대체 선책 알고리즘 자연 선택 알고리즘

akeem-hicks
Download Presentation

5. 화일의 정렬 / 합병

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 5. 화일의 정렬/합병

  2. Contents • 다단계 합병 (Polyphase Merge) • 2-원 다단계 합병의 예 • 초기 런 분배 방법 • 3-원 다단계 합병 • 3-원 다단계 합병의 예 • M-원 다단계 합병 알고리즘 • 계단식 합병 (Cascade Merge) • 3-원 계단식 합병 • M-원 계단식 합병 알고리즘 • 정렬/합병 유틸리티 • 사용자 정의 사항 • 정렬/합병의 예 • 저장 장치와 정렬/합병 • 파일 정렬 합병의 개요 • 파일 정렬/합병 • 정렬 단계 • 대체 선책 알고리즘 • 자연 선택 알고리즘 • 런 생성 방법의 비교 • 파일 정렬/합병 방법의 차이점 • 합병 단계 • m-원 합병(m-way merge) • 6개의 런에 대한 2-원 합병 • 12개의 런에 대한 2-원 합병 • 6개의 런에 대한 3-원 합병 • m-원 합병 알고리즘 • 선택트리 • 균형 합병 (balanced merge) • 12개의 런에 대한 2-원 균형 합병 • M-원 균형 합병 알고리즘

  3.  정렬/합병의 개요 • 파일 정렬 목적 • 순차 마스터 파일의 효율적 정렬 • 보고서 파일의 형식을 맞추기 위한 출력 데이터 정렬 • 파일 정렬(sorting)의 구분 • 내부 정렬(internal sorting) • 데이타가 적어서 메인 메모리 내에 모두 저장시켜 정렬 가능할 때 • 레코드 판독, 기록에 걸리는 시간이 문제되지 않는다. • 외부 정렬(external sorting) • 데이타가 많아서 메인 메모리의 용량을 초과하여 보조 저장 장치에 저장된 화일을 정렬할 때 • 주기억 장치에는 일정한 제한된 수의 레코드만을 유지 • 성능 면에서 레코드 판독, 기록에 걸리는 시간이 중요 • 정렬/합병(sort/merge) • 런(run) : 하나의 화일을 여러 개의 서브화일(subfile)로 나누어 내부 정렬 기법을 사용하여 정렬시킨 화일 • 런을 합병하여 원하는 하나의 정렬된 화일을 만든다.

  4. 외부 정렬(external sorting)의 예 • 2,000개의 레코드를 가지는 파일을 정렬 • 주기억 장치의 용량 : 1,000개의 레코드

  5. 합병의 기본 논리 시 작 1 1 서브화일 에서 처음 키 을 읽어라 2 2 2 서브화일 에서 처음 키 를 읽어라 YES YES 1 2 서브화일 의 서브화일 의 끝 EOF ? EOF ? 에 도착했는가 에 도착했는가 1 NO 2 서브화일 의 YES 2 서브화일 의 레코드를 정렬된 화일에 EOF ? 에 도착했는가 출력하라 1 서브화일 의 레코드를 정렬된 수록하라 2 서브화일 에서 YES NO 2 다음 키 를 읽어라 1 < 2 키 키 1 서브화일 에서 1 다음 키 을 읽어라 2 1 2 서브화일 의 서브화일 의 레코드를 합병화일에 레코드를 합병화일에 수록하라 수록하라 1 2 서브화일 에서 서브화일 에서 1 2 다음 키 을 읽어라 다음 키 를 읽어라 1 ▶ 합병의 기본 논리

  6. ▶ 화일 정렬/합병 • 정렬 단계(sort phase) • 정렬할 화일의 레코드들을 지정된 길이의 서브화일로 분할해서 정렬하여 런(run)을 만들어 입력 파일로 분배하는 단계 • 합병 단계(merge phase) • 정렬된 런들을 합병해서 보다 큰 런으로 만들고, 이것들을 다시 입력 파일로 재분배하여 합병하는 방식으로 모든 레코드들이 하나의 런에 포함되도록 만드는 단계

  7. 109 49 34 68 45 2 60 38 28 47 16 19 34 55 98 78 76 40 35 86 10 27 61 92 99 72 11 2 29 16 80 73 18 12 89 50 46 36 67 93 22 14 83 44 52 59 10 38 76 16 24 85 ▶ 정렬 단계 • 런 생성 방법 • 내부 정렬 (internal sort) • 대체 선택 (replacement selection) • 자연 선택 (natural selection) • 입력 화일의 예

  8. 런 1 : 34 45 49 68 109 런 2 : 2 28 38 47 60 런 3 : 16 19 34 55 98 런 4 : 35 40 76 78 86 런 5 : 10 27 61 92 99 런 6 : 2 11 16 29 72 런 7 : 12 18 73 80 89 런 8 : 36 46 50 67 93 런 9 : 14 22 44 52 83 런 10 : 10 16 38 59 76 런 11 : 24 85 (1) 내부 정렬 (internal sort) • 런 생성 방법 1. 파일을 n레코드씩 분할 2. 분할된 레코드들을 내부 정렬 기법으로 정렬 • 런 생성 결과 • 제일 마지막 런을 제외하고 모두 길이가 같다. • 가정 : 메인 메모리는 5개의 레코드를 유지

  9. (2) 대체 선택 (replacement selection) • 런 생성 방법 1. 입력 파일에서 버퍼에 m개 레코드 판독, 첫 번째 런 생성 2. 버퍼에서 키 값이 가장 작은 레코드를 선택해 출력 3. 입력 파일에서 다음 레코드 판독해 출력된 레코드와 대체 • if (입력 레코드의 키 값 < 출력된 레코드의 키 값) then 레코드에 “동결(frozen)”표시 • 동결된 레코드는 단계 2의 선택에서 제외 • 동결되지 않은 레코드는 단계 2로 돌아간다. 4. 동결된 레코드 모두 해제, 단계 2로 돌아가 새로운 런 선택 • 특징 • 내부 정렬과 달리 입력 파일의 일부 정렬된 레코드들의 순서를 이용 • 내부 정렬을 이용한 경우보다 런의 길이가 길다. • 런의 평균 예상 길이 : 2m

  10. ▶ 대체 선택 알고리즘

  11. 런 1 : 34 45 49 60 68 109 런 2 : 2 16 19 28 34 38 47 55 76 78 86 98 런 3 : 10 27 35 40 61 72 92 99 런 4 : 2 11 16 18 29 50 73 80 89 93 런 5 : 12 14 22 36 44 46 52 59 67 76 83 85 런 6 : 10 16 24 38 • 런 생성 결과

  12. 예제 : 다음과 같이 레코드가 입력되었을 때 대체선택으로 생성되는 첫번째 런은?(주기억장치에 3개의 레코드를 저장할 수 있다고 가정하라.) 입력 파일 : 15 8 20 6 22 19 25 24 17 3

  13. (3) 자연 선택 (natural selection) • 대체 선택 방법의 단점을 보완 • 하나의 런을 생성하기 직전에 주기억 장치의 대부분이 동결된 레코드들로 채워지게 된다. 이러한 레코드들은 현재 생성 중인 런에 대해서는 아무런 도움이 못된다. • 특징 • 대체 선택과는 달리 동결된 레코드들을 버퍼에 유지하지 않고 보조 저장 장치에 예비 장소를 설정하여 별도 저장 • 하나의 런은 예비장소가 꽉 차거나 입력 파일이 공백될 때까지 계속 생성 • 런을 길게 하여 런 수를 줄임  합병 과정 비용을 줄임

  14. ▶ 자연 선택 알고리즘

  15. 런 1 : 34 45 47 49 60 68 109 런 2 : 2 16 19 28 34 38 40 55 61 76 78 86 92 98 99 런 3 : 10 11 16 27 29 35 50 67 72 73 80 89 93 런 4 : 2 12 14 18 22 36 44 46 52 59 76 83 85 런 5 : 10 16 24 38 • 런 생성 결과

  16. 예제 : 다음과 같은 순서로 레코드가 저장되어 있는 파일을 외부정렬하기 위해 자연선택 알고리즘으로 런을 생성할 때 첫번째 생성되는 런은? (주기억장치와 보조화일에는 4개의 레코드를 저장할 수 있다.) 95 100 45 5 20 15 60 72 30 99 70 85 35 56 25

  17. ▶ 런 생성 방법의 비교 • 내부 정렬 • 마지막 런을 제외하고 모든 런들의 길이가 같음 • 런의 길이를 예측할 수 있으므로 합병 알고리즘이 간단 • 대체 선택 • 내부 정렬보다 평균적으로 훨씬 긴 런을 생성 • 런의 길이가 길수록 합병 비용이 적음 • 런의 길이가 일정치 않아 정렬/합병 알고리즘이 복잡 • 자연 선택 • 앞의 두 방법보다 더 긴 런을 생성할 수 있음 • 예비 장소로의 입출력이 문제가 됨 • 긴 런 생성에 따른 효율화가 예비 장소 전송 비용보다 이익이 될 수도 있음

  18. ▶ 화일 정렬/합병 방법의 차이점 • 차이점을 나타내는 매개 변수 • 적용하는 내부 정렬 방식 • 내부정렬을 위해 할당된 메인 메모리의 크기 • 정렬된 런들의 보조 저장 장치에서의 저장 분포 • 정렬/합병 단계에서 동시에 처리할 수 있는 런의 수 • 정렬/합병 기법의 성능 • 매개 변수에 따른 런의 수와 합병의 패스(pass) 수 결정 • 참고 : 패스 수는 정렬/합병 기법이 몇 번의 반복적 수행을 거쳐서 최종 파일에 출력하느냐를 나타내는 것 • 보조 저장 장치의상대적 참조 빈도수(reference frequency) • 전체 레코드 집합에 대해 수행되어야 할 정렬/합병의 패스 수 비교 • 성능에 영향을 미치는 요인 • 가능한 런(서브화일)의 길이를 길게 만들어 런의 수를 최소화 • 동시에 합병할 수 있는 런의 수를 늘리면 합병의 패스 수는 감소 • 보조 저장 장치에 분산 저장하면 부수적인 입출력 연산 동반

  19. ▶ 합병 단계 • 합병 수행 방법 • m-원 합병(m-way merge) • 균형 합병(balanced merge) • 다단계 합병(polyphase merge) • 계단식 합병(cascade merge)

  20. m-원 합병(m-way merge) • 특징 • m개(합병의 원 수)의 입력 파일을 동시에 처리하는 합병 • 입력 파일 m개, 하나의 출력 파일 : m+1개의 파일을 사용 • 많은 입출력 : 한 패스에 합병이 끝나지 않으면 런들을 다시 분배하기 위해 복사, 이동해야 함 • 이상적 정렬/합병 : m개의 런에 m개의 입력 파일 사용하여 한번의 m-원 합병을 적용 • 2-원 합병의 경우 • 한번 패스 : 합병된 런의 크기는 2배, 런의 수는 반 • N개의 런으로 분할된 파일 정렬 위한 패스 수 :

  21. 에 있는 3개의 런을 2개의 화일에 분배한다. 3 런 (5+6) 런(1+2) 1 런(1+2+3+4) 런(5+6) 2차 합병 3 런(3+4) 2 런(1+2+3+4) 1 3차 합병 3 런(1+2+3+4+5+6) 런(5+6) 2 (2개의 입력 화일과 1개 출력 화일) ▶ 6 개의 런에 대한 2-원 합병 (1) 정렬단계 1000레코드 씩 정렬된 6개의 런 내부 정렬 6000 레코드 정렬된 6개의 런을 2개의 화일에 분배한다. (2) 1차 합병 런5 4001-5000 런3 2001-3000 런1 1-1000 1 런(1+2) 런(3+4) 런(5+6) 1차합병 3 런6 5001-6000 런4 3001-4000 런2 1001-2000 2 (4) 2단계 합병 (5) 3단계 합병

  22. 3 3 에 있는 6개의된 런을 2개의 화일에 분배한다. 에 있는 3개의된 런을 2개의 화일에 분배한다. ▶12개의 런에 대한 2-원 합병 (1) 정렬단계 내부 정렬 500레코드 씩 정렬된 12개의 런 6000 레코드 정렬된 12개의 런을 2개의 화일에 분배한다. (2) 1차 합병 런(1+2) 런(3+4) ..... 런(11+12) 런11 런9 런1 1 ...... 1차 합병 3 런12 런10 런2 2 ...... (3) 2차 합병 1 런(9+10) 런(5+6) 런(1+2) 런(1+2+3+4) 런(5+6+7+8) 런(9+10+11+12) 2차 합병 3 런(11+12) 런(7+8) 런(3+4) 2

  23. 1 3차 합병 2 2 1 4차 합병 3 2 (4) 3차 합병 런(1+2+3+4) 런(9+10+11+12) 런(1+2+3+4+5+6+7+8) 런(9+10+11+12) 런(5+6+7+8) (5) 4차 합병 런(1+2+3+4+5+6+7+8) 런(1+2+3+ ... + 11 +12) 런(9+10+11+12)

  24. 4 에 있는 런을 3개의 입력 화일에 분배한다.( 이 경우에는 2개의 화일만 사용됨) ▶ 6개의 런에 대한 3-원 합병 (1) 정렬단계 내부 정렬 1000레코드 씩 정렬된 6개의 런 6000 레코드 정렬된 6개의 런을 3개의 입력 화일에 분배한다. (2) 1차 합병 런4 런1 1 런(1+2+3) 런(4+5+6) 1차 합병 4 런5 런2 2 3 런6 런3 (4) 2단계 합병 런(1+2+3) 1 런(1+2+..+6) 2차 합병 3 런(4+5+6) 2 (3개의 입력 화일과 1개의 출력 화일)

  25. ▶ m-원 합병 알고리즘 mWayMerge() // m-원 합병 알고리즘 // m : 입력 화일의 수 // FILE[] : 화일 변수들의 배열 // outfilenum : 출력 화일을 포함하는 화일 배열의 인덱스 // r : 현 단계에서 합병되지 않고 입력 화일에 남아 있는 런수 // runcount : 현 단계에서 생성된 런의 수 // 합병 단계 do { openFile(FILE[1], ..., FILE[m]); // for reading openFile(FILE[m+1]); // for writing runcount ← 0; do { mergeRuns(FILE[1], ..., FILE[m] ⇒ FILE[m+1]); runcount ← runcount + 1; } while (!end-of-file on any one input file); // 합병되지 않고 입력 화일에 남아 있는 런수의 계산 및 // 다음 단계의 출력 화일 선택 r ← 0; for (i ← m; i ≥ 1; i--) { if (!end-of-file(FILE[i])) r ← r + 1; else outfilenum ← i; } runcount ← runcount + r;

  26. // 화일을 배열에 재할당 FILE[1], ..., FILE[m+1] ← FILE[1], ..., FILE[outfilenum-1], FILE[outfilenum+1], ..., FILE[m+1], ..., FILE[outfilenum]; closeFile(FILE[1], ..., FILE[m]); // 런들의 분산 단계 openFile(FILE[m]); // for reading openFile(FILE[1], ..., FILE[m-1]); // for writing // FILE[1], ..., FILE[m] 내의 런수 차가 1 이하가 되도록 //⌈runcount/m⌉,⌈runcount/m⌉- 1,⌈runcount/m⌉- 2개씩의 런들을 배분 i ← 0; k ← m *⌈runcount/m⌉- runcount; do { i ← i + 1; if (k = 0) { if (end-of-file(FILE[i])) move(⌈runcount/m⌉ runs, from FILE[m] to FILE[i]); else move ((⌈runcount/m⌉- 1) runs, from FILE[m] to FILE[i]); } else { k ← k - 1; if (end-of-file(FILE[i])) move((⌈runcount/m⌉- 1) runs, from FILE[m] to FILE[i]); else move ((⌈runcount/m⌉- 2) runs, from FILE[m] to FILE[i]); } } while (i ≠ m-1); } while (runcount ≠ 1); // 정렬된 최종 목표 화일은 FILE[m] end mWayMerge()

  27. ▶ 선택 트리(selection tree) (1) • m개의 런을 하나의 큰 런으로 정렬 • m개의 런 중 가장 작은 키 값의 레코드를 계속 선택, 출력 • 간단한 방법 : m-1번 비교 • 선택 트리 : 비교 횟수를 줄일 수 있음 • 선택 트리의 종류 • 승자 트리(winner tree) • 패자 트리(loser tree)

  28. [1] 7 [2] [3] 7 9 [6] [5] [7] [4] 10 7 9 18 [14] [9] [10] [11] [12] [13] [15] [8] 11 10 21 7 9 10 50 18 16 22 22 13 13 12 52 19 18 28 24 26 20 18 59 21 30 23 런 1 런 2 런 3 런 4 런 5 런 6 런 7 런 8 선택 트리 (2) • 승자 트리(winner tree) • 특징 • 완전 이진 트리 • 각 단말 노드는 각 런의 최소 키 값 원소를 나타냄 • 내부 노드는 그의 두 자식 중에서 가장 작은 키 값을 가진 원소를 나타냄 • 런이 8개(k=8)인 경우 승자 트리 예

  29. 선택 트리 (3) • 승자 트리 구축 과정 • 가장 작은 키 값을 가진 원소가 승자로 올라가는 토너먼트 경기로 표현 • 트리의 각 내부 노드: 두 자식 노드 원소의 토너먼트 승자 • 루트 노드: 전체 토너먼트 승자, 즉 트리에서 가장 작은 키 값 가진 원소 • 승자 트리의 표현 • 승자트리는 완전 이원트리이기 때문에 순차 표현이 유리 • 인덱스 값이 i인 노드의 두 자식 인덱스는 2i와 2i+1 • 합병의 진행 • 루트가 결정되는 대로 순서순차에 출력 (여기선 7) • 다음 원소 즉 키값이 13인 원소가 승자트리로 들어감 • 승자 트리를 다시 재구성 • 노드 11에서부터 루트까지의 경로를 따라가면서 형제 노드간 토너먼트 진행

  30. [1] 9 [2] [3] 10 9 [6] [4] [5] [7] 10 13 9 18 [9] [10] [11] [12] [13] [14] [15] [8] 11 10 21 13 9 10 50 18 16 22 22 26 13 12 52 19 18 28 24 30 20 18 59 21 23 런 1 런 2 런 3 런 4 런 5 런 6 런 7 런 8 선택 트리 (4) • 다시 만들어진 승자트리의 예 • 이런 방식으로 순서 순차구축을 계속함

  31. 선택 트리 (5) • 패자 트리(loser tree) • 루트 위에 0번 노드가 추가된 완전 이원트리 • 성질 (1) 단말노드 :각 런의 최소 키값을 가진 원소 (2) 내부 노드 : 토너먼트의 승자대신 패자 원소 (3) 루트(1번 노드) : 결승 토너먼트의 패자 (4) 0번 노드 : 전체 승자(루트 위에 별도로 위치)

  32. [0] 7 출력 [1] 9 [2] [3] 10 18 [7] [6] [4] [5] 11 21 10 50 [8] [9] [10] [11] [12] [13] [14] [15] 11 10 21 7 9 10 50 18 16 22 22 13 13 12 52 19 18 28 24 26 20 18 59 21 30 23 23 런 1 런 2 런 3 런 4 런 5 런 6 런 7 런 8 선택 트리 (6) • 런이 8개(k=8)인 패자 트리의 예

  33. 선택 트리 (7) • 패자 트리 구축 과정 • 단말 노드: 각 런의 최소 키값 원소 • 내부 노드 • 두 자식 노드들이 부모노드에서 토너먼트 경기를 수행 • 패자는 부모 노드에 남음 • 승자는 그 위 부모 노드로 올라가서 다시 토너먼트 경기를 계속 • 1번 루트 노드 • 마찬가지로 패자는 1번 루트 노드에 남음 • 승자는 전체 토너먼트의 승자로서 0번 노드로 올라가 순서순차에 출력됨 • 합병의 진행 • 출력된 원소가 속한 런 4의 다음 원소, 즉 키값이 13인 원소를 패자트리 • 노드 11에 삽입 • 패자 트리를 다시 재구성 • 토너먼트는 노드 11에서부터 루트 노드 1까지의 경로를 따라 경기를 진행 • 다만 경기는 형제 노드 대신 형식상 부모 노드와 경기를 함

  34.  균형 합병 (balanced merge) • 자연합병(m-원 합병)의 단점 : 화일의 재분배 많은 I/O 필요 • 균형합병 • 출력할 때, 미리 다음 단계에 사용할 입력 화일로 재분배 즉, 출력 화일을 다음 단계의 입력 화일로 직접 사용 • m-원 자연합병 : m + 1 개의 화일 필요 • m-원 균형합병 : 2m 개의 화일 필요 (m 입력화일, m 출력화일) • 각 합병 단계 후 • 런의 총수는 합병 차수로 나눈 만큼 감소 • 런의 길이는 합병 차수의 두배씩 증가 • 필요한 합병단계의 수 • O(logm N) , N : 초기 런의 수

  35. 3 1 1 3 2차 합병 1차 합병 2 4 4 2 ▶ 12개의 런에 대한 2-원 균형 합병 (1) 정렬단계 내부 정렬 500레코드 씩 정렬된 12개의 런 6000 레코드 생성된 12개의 런을 2개의 화일에 분배한다. 런(1+2) 런(5+6) 런(9+10) (2) 1차 합병 런11 런9 ... 런1 런(3+4) 런(7+8) 런(11+12) 런12 런10 ... 런2 런(1+2) 런(5+6) 런(9+10) (3) 2차 합병 런(1+2+3+4) 런(9+10+11+12) 런(3+4) 런(7+8) 런(11+12) 런(5+6+7+8)

  36. 1 3 3차 합병 4 2 런(1+2+3+4+5+6+7+8) 3 4차 합병 1 런(1+2+3+ ... +12) 4 런(9+10+11+12) 런(1)은 4번 판독/기록되었음. 주의 (4) 3차 합병 런(1+2+3+4) 런(9+10+11+12) 런(1+2+3+4+5+6+7+8) 런(5+6+7+8) 런(9+10+11+12) (5) 4차 합병

  37. ▶ m-원 균형합병 알고리즘 balancedMerge() // m-원 균형합병 알고리즘 // m : 입력 화일 수(모두 2m개의 화일 사용) // FILE[] : 화일 변수들의 배열 // input-set-first : 현 단계에서 입력과 출력 세트를 구분하기 위한 플래그 // base : 출력 세트의 화일 중 첫 번째 화일의 번호 // outfilenum : 현 단계의 출력 화일 번호 // runcount : 현 단계에서 생성된 런의 수 input-set-first ← false; do { if (input-set-first) { input-set-first ← false; openFile(FILE[1], ..., FILE[m]); // for reading; openFile(FILE[m+1], ...,FILE[2m]); // for writing; base ← m + 1; } else { input-set-first ← true; openFile(FILE[1], ..., FILE[m]); // for writing; openFile(FILE[m+1], ...,FILE[2m]); // for reading; base ← 1; }

  38. // 합병 단계의 수행 outfilenum ← 0; runcount ← 0; do { mergeRun(input files ⇒ FILE[base+outfilenum]); runcount ← runcount + 1; outfilenum ← (outfilenum + 1) % m; } while (!end-of-file on all input files); rewind(input files and output files); } while (runcount ≠ 1); // input-set-first가 true면 최종 정렬 화일은 m+1, // false면 최종 정렬 화일은 1 end balancedMerge()

  39.  다단계 합병 (Polyphase Merge) • m-원 균형 합병 기법 • 2m개 화일 필요(m개 입력화일, m개 출력화일) • 단점 : m-1 개의 화일은 항상 유휴 상태 • 화일 유휴 문제, 런의 단순 복사 연산 개선 -> 파일의 활용도를 높임 • m-원 다단계 합병 • m 개의 입력 화일과 1 개의 출력 화일 • 입/출력 화일수가 같지 않음 : "불균형" 합병 • 초기 입력 화일에 대한 런의 분배가 복잡 • 각 합병 단계(pass) • 입력 화일의 어느 하나가 공백이 될 때까지 런들을 합병 • 공백이 된 입력 화일이 다음 합병 단계의 출력 화일이 됨

  40. ▶ 2-원 다단계 합병의 예 50 110 95 15 100 30 150 40 120 60 70 130 20 140 80 화일1 : 화일2 : 화일3 : 화일1 : 화일2 : 화일3 : 20 80 140 40 120 150 20 80 140 50 95 110 15 30 100 공백 60 70 130 40 60 70 120 130 150 15 30 50 95 100 110 공백 (a) 정렬 단계 결과 (b) 1차 합병 결과 화일1 : 화일2 : 화일3 : 화일1 : 화일2 : 화일3 : 15 20 30 40 50 60 70 80 95 100 110 120 130 140 150 공백 15 20 30 50 80 95 100 110 140 공백 공백 40 60 70 120 130 150 (c) 2차 합병 결과 (d) 3차 합병 결과

  41. ★ 다단계 합병에서 런 수의 변화 정렬 단계 1차 합병 2차 합병 3차 합병 화일 1 3 1 0 1 화일 2 2 0 1 0 화일 3 0 2 1 0 런합계 5 3 2 1

  42. ▶ 초기 런 분배 방법 • m-원 다단계 합병에서는 정렬 단계에서 런들을 생성하여 m개의 입력 파일에 분배할 때 합병 작업을 효율적으로 할 수 있도록 분배하는 것이 요구 • 런수의 변화 (m = 3, 3원 다단계 합병) 1, 1, 1, 3, 5, 9, 17, 31, … • 피보나치(Fibonacci) 수열 Ti = Ti-1 + Ti-2 + Ti-3, i > 3 Ti = 1, i ≤ 3 • 일반형 Ti = 1 , i ≤ m

  43. 화일 은 공백이 됨 화일 는 공백이 됨 화일 은 공백이 됨 1 2 3 ▶ 3-원 다단계 합병 정렬 단계 런1, 런6, 런7, 런10, 런11, 런12, 런13 1 런2, 런4, 런14, 런15, 런 16, 런17 내부 정렬 2 런3, 런5, 런8, 런9 6000 레코드 3 1차 합병 7개의 런 6개의 런 4개의 런 1 1차 합병 4 2 4개의 런 3 2차 합병 4개의 런 3개의 런 2개의 런 4 2차 합병 3 1 2개의 런 2 3차 합병 2개의 런 2개의 런 1개의 런 3 3차 합병 2 4 1개의 런 1 4차 합병 1개의 런 1개의 런 1개의 런 2 화일 는 공백이 됨 2 3 4 4차 합병 1 3 1개의 런 4

  44. ★ 초기 런 분배 방법 (m = 3, 화일수 = 17) 1 2 3 4 제 차 제 차 제 차 제 차 1 1 1 3 7 화일 2 1 2 2 6 3 1 2 4 4 3 5 9 17 합 계

  45. 1단계 시작 1단계 끝 2단계 끝 3단계끝 4단계 끝 화일 1 7 3 1 0 1 화일 2 6 2 0 1 0 화일 3 4 0 2 1 0 화일 4 0 4 2 1 0 합 계 17 9 5 3 1 ★ 각 합병 단계에서 화일당 런 수의 변화

  46. ▶ 3-원 다단계 합병의 예 50 110 95 15 100 30 150 40 120 60 70 130 20 140 80 화일1 : 화일2 : 화일3 : 화일4 : 화일1 : 화일2 : 화일3 : 화일4 : 50 95 110 공백 15 30 100 60 70 130 60 70 130 40 120 150 20 80 140 20 80 140 15 30 40 50 95 100 110 120 150 공백 (a) 정렬 단계 결과 (b) 1차 합병 결과 화일1 : 화일2 : 화일3 : 화일4 : 15 20 30 40 50 60 70 80 95 100 110 120 130 140 150 공백 공백 공백 (c) 2차 합병 결과

  47. ▶ m-원 다단계 합병 알고리즘 polyphaseMerge()       // m-원 다단계 합병 알고리즘 // m      : 입력 화일의 수 // FILE[]   : 화일 변수들의 배열 // (초기 입력 화일에는 피보나치 수열에 따라 런들이 분배되어 있다고 가정)     // 화일의 준비 for (i ← 1; i ≤ m; i++)         openFile(FILE[i]);   // for reading;     openFile(FILE[m+1]);     // for writing;     // 합병 단계 do {         do {             mergeRun(FILE[1], ..., FILE[m] ⇒ FILE[m+1]);         } while (!end-of-file(FILE[m]));         rewind(FILE[m] and FILE[m+1]);         closeFile(FILE[m] and FILE[m+1]);         openFile(FILE[m+1]);          // for reading         openFile(FILE[m]);           // for writing         // 화일을 배열에 재할당 FILE[1], FILE[2], ..., FILE[m+1]                 ← FILE[m+1], FILE[1], ..., FILE[m];     } while (!end-of-file on all files on FILE[2], ..., FILE[m]);     // 정렬된 최종 목표 화일은 FILE[1] end polyphaseMerge()

  48.  계단식 합병 (Cascade Merge) • 정렬/합병 과정에서 런들의 복사작업을 줄이려는 불균형 합병의 또 다른 형태 • m-원 계단식 합병(m-way cascade merge) • 주기 : m, m-1, m-2, …, 그리고 마지막에 2개의 입력 화일을 사용 • 런 생성 단계 : 런의 초기 분배가 중요 • 합병 단계 • m개의 입력화일로부터 m개의 런을 하나의 런으로 합병하여 출력 화일로 생성 • 처음 공백이 되는 입력 화일이 새로운 출력 화일이 됨 • m-1 개의 입력 화일이 이 새로운 출력 화일로 합병 • 2개의 입력 화일을 합병하는 단계가 되면 합병의 한 주기가 종료 • 한 주기에 각 레코드는 한번씩 처리

More Related