적응형 힙 정렬

Adaptive heap sort

컴퓨터 과학에서 적응형정렬적응형 정렬 패밀리의 비교 기반 정렬 알고리즘입니다.데이터에 기존 순서가 포함되어 있을 때 더 나은 성능을 발휘하는 힙 정렬의 변형입니다.1992년 Christos LevcopoulosOla Peterson에 의해 발표된 이 알고리즘은 [1]진동수로 사전 정렬성의 새로운 척도인 Osc를 사용합니다.기존의 힙 정렬과 같이 모든 데이터를 힙에 넣는 대신 적응형 힙 정렬은 데이터의 일부만 힙에 포함하므로 데이터의 사전 정렬성이 [1]높을 때 실행 시간이 크게 단축됩니다.

힙소트

힙 정렬은 이진 힙 데이터 구조를 사용하는 정렬 알고리즘입니다.이 메서드는 배열을 완전한 바이너리 트리로 간주하고 Max-Heap/Min-Heap을 구축하여 [2]정렬합니다.이것은 보통 다음 4단계를 포함합니다.

  1. Max-Heap(Min-Heap): 모든 노드가 각 자노드와 같거나 같도록 모든 데이터를 힙에 넣습니다(Min-Heap과 같거나 같음).
  2. 힙의 첫 번째 요소를 힙의 마지막 요소와 스왑합니다.
  3. 힙에서 마지막 요소를 제거하고 목록 끝에 배치합니다.첫 번째 요소가 힙의 올바른 위치에 오도록 힙을 조정합니다.
  4. 힙에 요소가1개만 있을 때까지 스텝2와 3을 반복합니다.이 마지막 요소를 목록 끝에 배치하고 목록을 출력합니다.목록의 데이터가 정렬됩니다.

다음으로 Max-Heap을 구축하고 힙 구축 후 어레이를 정렬하는 C++ 구현을 나타냅니다.

#<>iostream>, 증가하는 주문에 대한 배열 sort /* AC++샘플 더미 코드가*/네임 스페이스 std 사용하고 무효 heapify(intarray[],int 시작,int 끝).max-heap 2진 트리 보이드 heapify(intarray[],int 시작,int 끝){int 부모=시작을 마련한 기능//;int 아이)부모*2+1,(아이<>)끝){만약 포함한다.(아이+1<>)엔드 탭 //when이 두 자식 노드{만약(array[아이+1]>array[아이]){아이++, //take 더 큰 자식 노드}}만약(array[부모]>array[아이]){대가;//if는 부모 노드가 더 많다면 그건 이미 heapified}만약(array[부모]<>array[아이])을 끓였을 때 아이 노드 이상 p.노드arent{스왑(array[부모], array[아이]);// 스위치는 부모님과 자식 노드 부모)아이 아이)아이*2+1;//continue는 소외되고 비교하는 자식 노드와 자식 노드}}}heap_sort(intarray[],int len),//heap_sort 기능{(intilen/2-1;나는입니다.;=0;나는 정도.)//Step 1heap_sort(intarray[],int len)물 안전 공간:b. 무효uIld을(intilen원-1;나는입니다.;=0; 난...)//Step 4의 max-heap{heapify(배열, 나는, len).}:반복 2단계와 3까지 끝냈다{swap(array[0], array[나는]).//2단계:배열 heapify(배열, 0, i-1)의 끝에 최대아 놓으십시오.//3단계:가 나무에서 다시 heapify이 최대 한계를 제거하}}int main(){intarray[]){42,1283년, 123,654., 239847, 45, 97, 85, 763, 90, 770, 616, 328, 1444, 911, 315, 38, 5040, 1); // int array_len = size of (array)// heap sort return 0;// } 어레이 길이

사전 정렬의 척도

사전 정렬 측도는 주어진 [3]시퀀스의 기존 순서를 측정합니다.이러한 사전 정렬성 측정은 정렬 프로세스 중에 힙에 넣을 데이터 수와 실행 시간 [4]하한을 결정합니다.

진동(Osc)

X < 1,, 3. ,x ({ X = <의 경우, 는 점i,xi)을 통해 수평선으로 교차하는 X의 선 플롯의 에지로 정의됩니다.수학적으로는 C ( i ) { 1j < j , j + < x <{ j , + } { Cross ( x { } ) } 로 정의됩니다. and \max1( 1 1 1 1 1 1 11 \ style 1 \n) 。X의 진동(Osc)은 O c i C ( i ) { Osc)=\ _ Cross[1]되는 교차점의 총 수입니다

기타 조치

원래 Osc 측정값 외에도 다른 알려진 측정값에는 반전 Inv 수, 런 , 블록 수, Max, ExcRem 측정값이 포함됩니다.이러한 다양한 측정치의 대부분은 적응형 힙 정렬과 관련이 있습니다.모든 Osc 최적 알고리즘은 Inv 최적 및 실행 최적, 모든 Inv 최적 알고리즘은 Max 최적, 모든 블록 최적 알고리즘은 Exc 최적 및 Rem 최적 등 [4]일부 측정값이 다른 측정값을 지배합니다.

알고리즘.

적응형 힙 정렬은 데이터 내의 기존 순서를 이용하여 사전 정렬의 척도로 도출된 하한에 대한 최적성(점근적으로 최적)을 추구하는 힙 정렬의 변형입니다.힙 정렬에서는 X < 1,2, , n {\ X= < ..,의 경우 모든 n개의 요소를 힙에 넣은 후 최대값(또는 최소값)을 n회 추출합니다.각 max-extraction 액션의 시간은 힙 크기의 로그이므로 표준 힙 정렬의 총 실행 시간은 O(n log n)[2]입니다.적응형 힙 정렬의 경우 모든 요소를 힙에 배치하는 대신 가능한 최대 데이터(최대 후보)만 힙에 배치되므로 최대값(또는 최소값)을 찾을 때마다 필요한 실행 수가 줄어듭니다.먼저 데이터를 바이너리 트리에 넣고 트리 내의 각 노드를 모든 자식 노드보다 크게(또는 작게) 함으로써 O O 입력에서 데카르트 트리를 구축하고 데카르트 트리의 루트를 빈 힙에 삽입합니다.그런 다음 이진 힙에서 최대값을 반복적으로 추출하고, 데카르트 트리에서 최대값을 검색한 다음, 데카르트 트리인 왼쪽 및 오른쪽 자식(있는 경우)을 이진 힙에 추가합니다.입력이 이미 거의 정렬되어 있는 경우, 데카르트 트리는 매우 불균형하고 왼쪽과 오른쪽의 노드가 거의 없기 때문에 바이너리 힙은 작게 유지되며, 알고리즘은 이미 [5]정렬되어 있는 입력에 대해 O logn O n보다 더 정렬할 수 있습니다.

입력: 정렬해야 하는 n개의 요소 배열 데카르트 트리 l(x)을 구성합니다. 추출된 최대 요소에 l(x)에 하위 요소가 있는 경우 힙에서 i =에 대해 1 ~ n의 힙에 l(x)의 루트를 삽입합니다. {retrieve l(x)의 하위 요소를 힙에 삽입합니다. }[1]

결점

수십 년에 걸친 연구에도 불구하고 적응형 힙 정렬 이론과 그 실용성 사이에는 여전히 차이가 있습니다.알고리즘은 데카르트 트리와 포인터 조작을 사용하기 때문에 캐시 효율이 낮고 메모리 요건이 높아 [4]구현 성능을 저하시킵니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c d Levcopoulos, C.; Petersson, O. (1993-05-01). "Adaptive Heapsort". Journal of Algorithms. 14 (3): 395–413. doi:10.1006/jagm.1993.1021. ISSN 0196-6774.
  2. ^ a b Schaffer, R.; Sedgewick, R. (1993-07-01). "The Analysis of Heapsort". Journal of Algorithms. 15 (1): 76–100. doi:10.1006/jagm.1993.1031. ISSN 0196-6774.
  3. ^ Mannila, Heikki (April 1985). "Measures of Presortedness and Optimal Sorting Algorithms". IEEE Transactions on Computers. C-34 (4): 318–325. doi:10.1109/TC.1985.5009382. ISSN 0018-9340.
  4. ^ a b c Edelkamp, Stefan; Elmasry, Amr; Katajainen, Jyrki (2011). Iliopoulos, Costas S.; Smyth, William F. (eds.). "Two Constant-Factor-Optimal Realizations of Adaptive Heapsort". Combinatorial Algorithms. Lecture Notes in Computer Science. Springer Berlin Heidelberg. 7056: 195–208. doi:10.1007/978-3-642-25011-8_16. ISBN 9783642250118. S2CID 10325857.
  5. ^ "Archive of Interesting Code". www.keithschwarz.com. Retrieved 2019-10-31.