ソートアルゴリズム(c)は、ヒープソートやヒープソートJava実装と分析を有界

1.ヒープソートの
有界ヒープソート:基数ソートは、有界なもののサイズに適しており、彼のほかに、あなたが発生する可能性の一つの他の特別なソートアルゴリズムがあります。あなたは非常に大規模なデータセットを扱っている場合は、kがnよりもはるかに小さい最初の10または最初のk個の要素を、取得したい、それが便利です。

たとえば、あなたが毎日のトランザクションの十億を扱うWebサービスを監視しているとします。各一日の終わりには、最大のk個のトランザクション(または最も遅い、またはXXの他のほとんど)を報告しなければなりません。1つのオプションは、すべてのトランザクションを保管し、一日の終わりにそれらを並べ替え、その後、kの最大値を選択することです。必要な時間は、我々は、単一のプログラムのメモリに記録されたトランザクションの十億にできないことがありますので、非常に遅い比例nlogn、です。私たちは、「外部」ソートアルゴリズムを使用する必要があります。

私たちは、最初の二分探索木(BST)のデータ構造が似ているヒープ、見てください。いくつかの違いがあります。

BSTにおいて、各ノードx「は、BST特性」を有する:xの左サブツリー内のすべてのノードをX未満である、右サブツリー内のすべてのノードは、xより大きい。
スタックでは、各ノードx「はヒープ特性」を有する2つのサブツリー内のすべてのノードは、xより大きい。
バランスBSTのようなヒープ、あなたが要素を追加または削除するとき、彼らは再バランスツリーにいくつかの余分な作業を行います。このように、素子のアレイは、効率的に実装するために使用されてもよいです。
今の議論は、小さな根ヒープです。サブツリーのルートノードは、大きなルートスタックのための、より小さい場合。

ヒープ最小の要素は常にルートなので、一定の時間でそれを見つけることができます。時間の高さhヒープに比例して、ツリーを必要な要素を追加および削除。ヒープは常にバランスが取れているのでそして、そのログの時間は、nに比例しています。

JavaPriorityQueueヒープ実装。キュー優先度つきキューが提供して投票を含め、インタフェースで指定する方法を提供します。

提供:各ノードが持つように要素は、スタックを更新し、キューに追加「スタックのプロパティを。」LOGN時間を必要としています。
世論調査:ルートノードから、キュー内の最小の要素を削除し、ヒープを更新します。LOGN時間を必要としています。
優先度つきキューを考えると、あなたは簡単にこのようなn個の要素の集合を並べ替えることができます。

コレクションのすべての要素が優先度つきキューに追加し、提供を使用してください。
使用の世論調査は、キューから要素を削除し、リストに追加しました。
世論調査は、キューに残っている最小の要素を返すので、要素が昇順リストに追加します。この順序は、ヒープ・ソートと呼ばれています。

キューに必要なn個の要素nlogn時間を追加します。同様にn個の要素を削除します。したがってヒープソートは、実行時間はO(n LOGN)です。

 


2.代码实现:
/ **
* @Author Ragty
* @description堆排序
* @Date 19:15 2019年6月12日
** /
公共のボイドヒープソート(リスト<T>リスト、コンパレータ<T>コンパレータ){
優先度つきキュー< T>ヒープ=新しい優先度つきキュー<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.ヒープソートが有界
スタックはスタックの要素をk個まで含有に制限される有界。あなたはn個の要素を持っている場合は、最大のk個の要素を追跡することができます。

当初はスタックが空です。各要素xの場合:

支店1:不満ヒープ場合、ヒープにXを追加します。
ブランチ2:充填されている場合、Xのヒープの最小の要素と比較してください。xが小さい場合は、それを捨てることができますので、それは、最大のk個の要素の一つにすることはできません。
支店3:充填され、xは、ヒープの最小の要素よりも大きい場合は、ヒープから最小の要素を削除し、Xを追加してください。
ヒープの最上部を使用最小要素である、我々は、k個の要素の最大値を追跡することができます。のは、このアルゴリズムの性能を分析してみましょう。各要素のために、私たちは次のいずれかを持っています:

ブランチ1:スタックに追加の要素はO(Kログ)です。
ブランチ2:スタック内の最小要素はO(1)で探します。
ブランチ3:最小の要素を削除するには、O(ログ・K)です。追加x(kはログ)Oです。
要素が昇順に存在する場合、最悪のケースで、我々は常にブランチ3を実行します。この場合、n個の要素の合計処理時間はO(N Kログ)であり、nに対して線形です。

 

4.代码实现:
/ **
* @Author Ragty
* @description有界堆排序
* @Date午後07時49分2019年6月12日
** /
公共リスト<T> TOPK(int型K、リスト<T>のリスト、コンパレータ<T>コンパレータ){
優先度つきキュー<T>ヒープ=新しい優先度つきキュー<T>(はlist.size()、コンパレータ);
用(Tエレメント:リスト){
IF(heap.size()<K){
heap.offer(要素)
持続する;
}
int型CMP = comparator.compare(要素、heap.peek())。
IF(CMP> 0){
heap.poll()。
heap.offer(要素)
}
}
リスト<T> RES =新規のLinkedList <T>();
(!heap.isEmpty()){しばらく
res.add(heap.poll(http://www.my516.com));
}
RESを返します。


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、4、2、7))。
一覧<整数>キュー= sorter.topK(4、リスト、コンパレータ);
System.out.println(キュー)。
1
2
3

 

5.スペースの複雑さは
これまでのところ、我々は、実行時間分析の多くについて話しましたが、多くのアルゴリズムのために、我々はまた、スペースを懸念しています。たとえば、マージソートの欠点は、コピーしたデータということです。私たちの実装では、それに割り当てられたスペースの量はO(nはn個のログ)です。最適化によって、空間はO(N)に還元することができます。

それは要素の並べ替えを置きますので、これとは対照的に、挿入ソートデータは、コピーされません。これは、使い捨ての要素を比較し、他のいくつかのローカル変数を使用するために2つの一時変数を使用しています。しかし、それは空間Nの使用に依存しません。

私たちのヒープソートの実装では、要素を格納するために、新しいPriorityQueueを作成するので、スペースはO(n)は、しかし、あなたの場所にリストを並べ替えることができれば、あなたは宇宙Oヒープソートの(1)の実装を使用することができます。

単に有界スタックアルゴリズムの実装の利点の一つは、それがスペースを必要とし、kは(我々は要素を維持したい数)に比例し、kは、通常はnよりはるかに小さいです。

ソフトウェア開発者は、それが適切である、多くの用途のために、実行している時間よりも多くのスペースを集中する傾向があります。しかし、大規模なデータセットのために、スペースが均等以上に重要かもしれません。例えば:

データセットは、プログラムメモリに配置することができない場合は、実行している時間は、通常、大幅に増加している、または実行されません。あなたは、アルゴリズムを選択した場合は、より少ないスペースを必要とし、これをメモリに計算することができ、それはより速く実行できます。ここでも、少ないスペースプログラムを使用して、CPUキャッシュをより良く利用することができ、より高速に実行。
あなたは、各プログラムのために必要なスペースを減らすことができれば、同時に複数のプログラムを実行するには、サーバー上では、ハードウェアとエネルギーコストを削減、同じサーバー上で複数のプログラムを実行することができます。
---------------------

おすすめ

転載: www.cnblogs.com/ly570/p/11106210.html