정렬 알고리즘 (c)는 힙 종류 및 힙 종류의 Java 구현 및 분석을 경계

1. 힙 정렬의
경계 힙 정렬 : 기수 정렬은 경계 사물의 크기에 적합, 그 외에 발생할 수있는 다른 하나의 특별한 정렬 알고리즘이있다. 매우 큰 데이터 세트를 처리하는 경우 k는 n보다 훨씬 작 처음 10 또는 최초의 K 요소를 얻으려면, 그것은 유용합니다.

예를 들어, 매일 거래의 수십억을 처리하는 웹 서비스를 모니터링하는 가정합니다. 하루의 끝에서, 당신은 가장 큰 K 트랜잭션 (또는 가장 느린, 또는 XX의 다른 대부분을)보고해야합니다. 하나의 옵션은 모든 트랜잭션을 저장하는 하루의 끝에으로 정렬 한 다음 K의 최대 값을 선택하는 것입니다. 필요한 시간은 우리가 하나의 프로그램에 대한 메모리에 기록 된 트랜잭션 수십억하지 못할 수 있기 때문에, 매우 느립니다 비례 nlogn입니다. 우리는 "외부"정렬 알고리즘을 사용해야합니다.

우리는 먼저 이진 검색 트리 (BST) 데이터 구조가 유사한이다 힙, 봐. 몇 가지 차이점이 있습니다 :

BST, 각 노드 x "는 BST 특성"을 가지고 : x의 왼쪽 서브 트리 X보다 작은 모든 노드를 오른쪽 하위 트리의 모든 노드는 X보다 큰.
두 하위 트리의 모든 노드가 X보다 큰 : 스택에서 각 노드 x는 "힙 특성"을 가지고있다.
균형 잡힌 BST와 같은 힙, 추가하거나 요소를 삭제할 때, 그들은 나무를 다시 균형을 몇 가지 추가 작업을 할 것입니다. 따라서, 요소들의 어레이를 효율적으로 구현하는데 이용 될 수있다.
이제 논의는 작은 뿌리 힙입니다. 서브 트리의 루트 노드는 큰 루트 스택에 대한보다 작은 경우.

힙 가장 작은 요소는 항상 루트입니다, 그래서 우리는 일정 시간에서 찾을 수 있습니다. 시간의 높이 h 힙에 비례하고 추가 및 제거 할 요소에 트리를 필요로했다. 힙은 항상 균형이기 때문에, 그래서 로그 시간은 N에 비례한다.

JavaPriorityQueue 힙의 구현입니다. 큐 PriorityQueue 인은 제공 및 설문 조사를 포함한 인터페이스에 지정하는 방법을 제공 :

제공 : 요소는 각 노드가 갖도록 스택을 업데이트 큐에 추가 "스택 속성." logn 시간이 필요합니다.
여론 조사 : 루트 노드에서 큐에서 가장 작은 요소를 삭제하고, 힙을 업데이트합니다. logn 시간이 필요합니다.
사용해, PriorityQueue 감안할 때, 당신은 쉽게이 같은 n 개의 요소의 집합을 정렬 할 수 있습니다 :

서비스를 사용하여 컬렉션의 모든 요소 PriorityQueue 인에 추가 할 수 있습니다.
사용 여론 조사 큐에서 요소를 제거하고 목록에 추가됩니다.
투표가 큐에 남아있는 가장 작은 요소를 반환하기 때문에, 요소는 오름차순으로 목록에 추가됩니다. 이 순서는 힙 종류라고합니다.

큐에 필요한 n 개의 요소 nlogn 시간을 추가합니다. 뿐만 아니라 n 개의 요소를 삭제합니다. 따라서 힙 정렬 시간을 실행하면 O (logn N)이다.

 


2.代码实现:
/ **
* @Author Ragty
* @description堆排序
* @date 19시 15분 2019년 6월 12일
** /
공개 무효 힙 정렬 (목록 <T>에서 비교기 <T> 비교기) {
PriorityQueue 인 < T> = 힙 새로운 PriorityQueue 인 <T> (는 list.size (), 비교기);
heap.addAll (목록);
이 list.clear ();
반면 {(heap.isEmpty ()!)
에는 list.add (heap.poll ());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
测试代码:

목록 = 새로운 ArrayList에 <정수> (Arrays.asList (3, 5, 1, 4, 2));
sorter.heapSort (목록, 비교기);
에서 System.out.println (리스트);
1
2
3

 

3. 힙 정렬은 경계
스택 요소 케이까지 포함 스택에 제한 경계. 당신이 n 개의 요소가있는 경우, 당신은 가장 큰 K 요소를 추적 할 수 있습니다 :

처음 스택이 비어 있습니다. 각 원소 X의 ​​경우 :

지점 1 : 불만 힙 경우, 힙에 X를 추가합니다.
지점 2 : 채워진 경우, x의 힙의 가장 작은 요소와 비교하시기 바랍니다. x가 작은 경우, 그것은 최대의 K 요소 중 하나가 될 수 없습니다, 그래서 당신은 그것을 폐기 할 수 있습니다.
지점 3 : 작성, x는 힙의 가장 작은 요소보다 큰 경우, 힙에서 가장 작은 요소를 삭제하고 추가 x하시기 바랍니다.
힙의 상단을 가장 작은 요소가되고 있습니다, 우리는 K 요소의 최대 값을 추적 할 수 있습니다. 의이 알고리즘의 성능을 분석 할 수 있습니다. 각 요소에 대해, 우리는 다음 중 하나가 :

지점 1 스택에 추가 요소는 O (K 로그)이다.
지점 2 : 스택에서 가장 작은 요소를 찾기는 O (1).
3 점 : 작은 요소를 제거는 O (로그 K)이다. O는 (K 로그)는 추가 x.
요소가 오름차순으로 존재하는 경우 최악의 경우, 우리는 항상 지점 3을 수행합니다. 이 경우, N 개의 요소의 총 처리 시간은 O (N 로그 K)이고, n은 선형이다.

 

4.代码实现:
/ **
* @Author Ragty
* @description有界堆排序
* @date 19시 49분 2019년 6월 12일
** /
공개 목록 <T>은 TopK (INT k에 목록 <T>에서, 비교기 <T> 비교기) {
PriorityQueue 인 <T> = 힙 새로운 PriorityQueue 인 <T> (는 list.size (), 비교기);
(T 요소리스트) {위한
경우 (heap.size () <K) {
heap.offer (요소);
잇다;
}
INT CMP = comparator.compare (요소 heap.peek ());
만약 CMP (> 0) {
heap.poll ();
heap.offer (요소);
}
}
에서 <T> = 입술 새로운 LinkedList의 <T> ();
반면 {(heap.isEmpty ()!)
res.add (heap.poll (http://www.my516.com));
}
고해상도를 반환;


2
. 3
. 4
. 5
. 6
. 7
. 8
. 9
(10)
. (11)
(12)은
13 인
14
15
16
17.
18 인
19.
20는
21이다
(22)이
23 인
24
시험 번호 :

목록 = 새로운 ArrayList에 <정수> (Arrays.asList (6, 3, 5, 8, 1, 2, 4, 7));
목록 <정수> = sorter.topK 큐 (도 4에서, 비교기);
에서 System.out.println (큐);
1
2
3

 

5. 공간의 복잡성은
지금까지 우리는 런타임 분석을 많이 이야기했지만, 많은 알고리즘, 우리는 또한 공간에 대한 우려하고있다. 예를 들어, 병합 정렬 단점은이 데이터를 복사한다. 우리의 실시 예에서, 그것에 할당 된 공간의 양을 O (N 로그 n)이다. 최적화함으로써, 공간은 O (N)으로 감소 될 수있다.

그것은 요소의 정렬 배치 때문에 반대로 삽입 정렬 데이터를 복사하지 않는다. 이 일회용 요소를 비교하고, 다른 로컬 변수를 사용하여 두 개의 임시 변수를 사용한다. 그러나 공간 n의 사용에 의존하지 않습니다.

우리의 힙 정렬의 구현 요소를 저장하기 위해, 새로운 PriorityQueue를 작성, 그래서 공간은 O (N)입니다,하지만 당신은 장소에 목록을 정렬 할 수 있습니다, 당신은 공간 O 힙 정렬 (1) 구현을 사용할 수 있습니다.

단지 경계 스택 알고리즘 구현의 장점 중 하나는, 그것은 공간을 필요로 k는 (우리가 요소를 보관할 수)에 비례하고, k는 일반적으로 n보다 훨씬 작습니다.

소프트웨어 개발자는 많은 응용 프로그램을 위해, 그것은 적절한, 실행 시간보다 더 많은 공간을 집중하는 경향이있다. 그러나 대용량 데이터 세트에 대한 공간은 동등하거나 더 중요 할 수 있습니다. 예를 들면 :

데이터 세트는 프로그램 메모리에 배치 할 수없는 경우, 실행 시간은 일반적으로 크게 증가, 또는 실행되지 않습니다. 당신이 알고리즘은 적은 공간을 필요로 선택하고,이 메모리에 계산 될 수 있다면, 더 빨리 실행할 수 있습니다. 또, 적은 공간 프로그램을 사용하여, CPU 캐시를보다 효율적으로 사용할 수 있고, 빠르게 실행합니다.
각 프로그램에 필요한 공간을 줄일 수있는 경우, 동시에 여러 프로그램을 실행하는 서버에서, 당신은 하드웨어 및 에너지 비용을 절감, 동일한 서버에서 더 많은 프로그램을 실행할 수 있습니다.
---------------------

추천

출처www.cnblogs.com/ly570/p/11106210.html