적응형 힙 정렬
Adaptive heap sort컴퓨터 과학에서 적응형 힙 정렬은 적응형 정렬 패밀리의 비교 기반 정렬 알고리즘입니다.데이터에 기존 순서가 포함되어 있을 때 더 나은 성능을 발휘하는 힙 정렬의 변형입니다.1992년 Christos Levcopoulos와 Ola Peterson에 의해 발표된 이 알고리즘은 [1]진동수로 사전 정렬성의 새로운 척도인 Osc를 사용합니다.기존의 힙 정렬과 같이 모든 데이터를 힙에 넣는 대신 적응형 힙 정렬은 데이터의 일부만 힙에 포함하므로 데이터의 사전 정렬성이 [1]높을 때 실행 시간이 크게 단축됩니다.
힙소트
힙 정렬은 이진 힙 데이터 구조를 사용하는 정렬 알고리즘입니다.이 메서드는 배열을 완전한 바이너리 트리로 간주하고 Max-Heap/Min-Heap을 구축하여 [2]정렬합니다.이것은 보통 다음 4단계를 포함합니다.
- Max-Heap(Min-Heap): 모든 노드가 각 자노드와 같거나 같도록 모든 데이터를 힙에 넣습니다(Min-Heap과 같거나 같음).
- 힙의 첫 번째 요소를 힙의 마지막 요소와 스왑합니다.
- 힙에서 마지막 요소를 제거하고 목록 끝에 배치합니다.첫 번째 요소가 힙의 올바른 위치에 오도록 힙을 조정합니다.
- 힙에 요소가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, Exc 및 Rem 측정값이 포함됩니다.이러한 다양한 측정치의 대부분은 적응형 힙 정렬과 관련이 있습니다.모든 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]구현 성능을 저하시킵니다.
「 」를 참조해 주세요.
레퍼런스
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ "Archive of Interesting Code". www.keithschwarz.com. Retrieved 2019-10-31.