Java プログラミング スキル - データ構造とアルゴリズム「基数ソート」

Java プログラミング スキル - データ構造とアルゴリズム「基数ソート」

[[394975]]

基数ソート

  1. 基数ソートは「分散ソート」に属し、「バケット ソート」または「ビン ソート」とも呼ばれます。想像どおり、ソートする要素をキー値の各ビットの値に応じて特定のバケットに分散してソート効果を実現します。
  2. 基数ソートは安定性ソートに属し、基数ソートは効率的な安定性ソート方法です。
  3. 基数ソートはバケットソートの拡張です。
  4. 基数ソートは 1887 年にヘルマン・ホレリスによって発明されました。実装方法は、整数を桁数に応じて異なる数値に分割し、各桁を個別に比較します。

ソートの基本的な考え方

比較するすべての値は同じ桁の長さになるようにし、短い数値には先頭にゼロを埋め込みます。次に、最下位ビットから始めて、1 つずつ並べ替えます。このように、最下位ビットから最上位ビットまでソートすると、シーケンスは順序付けられたシーケンスになります。

コード例

  1. パッケージ com.xie.sort;
  2.  
  3. パブリッククラスRadixSort {
  4. 公共 静的void main(String[] args) {
  5. int [] arr = 新しいint [8000000];
  6. ( int i = 0; i < 8000000; i++) {
  7. arr[i] = ( int )(Math.random()*800000000);
  8. }
  9. 長い開始 = System.currentTimeMillis();
  10. 基数ソート(arr);
  11. 長い終了= System.currentTimeMillis();
  12. System.out.println ( "所要時間:" +( end -start)+ "ms" );
  13. /*
  14. 800万データ、時間消費: 939ミリ秒
  15. */
  16. }
  17.  
  18. // 基数ソート
  19. 公共 静的void radixSort( int [] arr) {
  20.  
  21. 整数 最大値= arr[0];
  22. ( int i = 1; i < arr.length; i++) {
  23. もし(arr[i] >最大値){
  24. 最大値= arr[i];
  25. }
  26. }
  27. //配列内の最長桁数
  28. int最大長さ = (最大+ "" ).length();
  29.  
  30. //ラウンド1(各要素の単位をソート)
  31. // 10 個のバケットを表す 2 次元配列を定義します。各バケットは 1 次元配列です。
  32. //1. 2次元配列には10個の1次元配列が含まれる
  33. //2. 数値を入れるときにデータがオーバーフローするのを防ぐために、各1次元配列(バケット)のサイズはarr.lengthに設定されます。
  34. //3. 基数ソートは、空間を時間の代わりに使う古典的なアルゴリズムである
  35. int [][] バケット = 新しいint [10][arr.length];
  36.  
  37. //各バケットに実際に保存されているデータの量を記録するため、各バケットに毎回入れられるデータの数を記録する 1 次元配列を定義します。
  38. //bucketElementCounts[0]はbucket[0]に格納されたデータの数を記録します。
  39. int [] バケット要素カウント = 新しいint [10];
  40.  
  41. // バケットの順序に従って(1次元配列の添え字を順に取り出して元の配列に入れる)
  42. 整数 インデックス= 0;
  43. ( int i = 0, n = 10; i < maxLength; i++, n *= 10) {
  44. ( int j = 0; j < arr.length; j++)の場合{
  45. //桁数を取得する
  46. int digitOfElement = arr[j] / n % 10;
  47. //対応するバケットを
  48. バケット[要素の桁数][バケット要素数[要素の桁数]] = arr[j];
  49. バケット要素数[要素の桁数]++;
  50. }
  51.  
  52. インデックス= 0;
  53. //各バケットを走査し、バケット内のデータを元の配列に格納します
  54. ( int k = 0; k < bucketElementCounts.length; k++) {
  55. //バケットにデータがある場合は、元の配列に格納します
  56. バケット要素数[k]が0の場合
  57. //k 番目のバケット (つまり、k 番目の 1 次元配列) をループ バケットに格納します。
  58. ( int l = 0; l < バケット要素カウント[k]; l++) {
  59. // 要素を取り出して arr に格納します
  60. arr[インデックス] = バケット[k][l];
  61. インデックス++;
  62. }
  63. }
  64. バケット要素数[k] = 0;
  65. }
  66. }
  67. }
  68. }

基数ソートの手順

  1. 基数ソートではスペースと時間をトレードオフするため、大量のデータをソートするときに OutOfMemoryError が発生しやすくなります。
  2. 基数ソートは安定しています。 [注: ソートするレコード シーケンスに同じキーワードを持つレコードが複数あると仮定します。ソート後もこれらのレコードの相対順序が変わらない場合、つまり元のシーケンスで r[i]=r[j] であり、r[i] が r[j] の前にあり、ソートされたシーケンスでも r[i] が依然として r[j] の前にある場合、このアルゴリズムは安定していると呼ばれ、そうでない場合は不安定です。]
  3. 負の数を含む配列の基数ソートについては、https://code.i-harness.com/zh-CN/q/e98fa9 を参照してください。

<<:  組織のサイバーセキュリティ向上における人工知能の役割

>>:  高度な数学に希望があります!ニューラルネットワークは1秒未満で偏微分方程式を解く

ブログ    
ブログ    

推薦する

2017年データサイエンスおよび機械学習業界現状調査:Pythonが最も人気のある言語

[[209261]]今年、Kaggle はデータ サイエンスと機械学習の状況を包括的に理解することを...

AGI(汎用人工知能)は数年のうちに実現されるでしょうか? 3つのテクノロジー大手が判決を下す

2011年、Google DeepMindの共同創設者であるシェーン・レッグは、2028年までにAI...

...

美団点評におけるディープラーニングの応用

序文近年、ディープラーニングは音声、画像、自然言語処理などの分野で優れた成果を上げており、最も注目さ...

AIが世界を侵略する中、プログラマーは2040年になってもコードを書き続けることができるでしょうか?

アルファ囲碁が中国の囲碁の天才柯潔に3連勝した後、ロボット脅威論がますます広まりました。電話接客、デ...

プログラマーは「自殺」している。人工知能が進化し続ける中、人間は何をすべきか?

中国、日本、韓国の囲碁名人数十人がこのゲームに挑み、アルファ碁は1敗もせずに60連勝した。その後、世...

OpenAI API 高度な関数呼び出し実装プラグイン!

関数呼び出しの紹介関数呼び出しとは何ですか? OpenAI Chat API公式ドキュメント: Ch...

PyTorch を学ぶには?簡単すぎる

多くの友人から、PyTorch の学習方法を尋ねられました。長期間の練習を経て、初心者が知っておく必...

TensorFlow の最大の機械学習データセット 30 件

導入画像、ビデオ、オーディオ、テキストが含まれており、非常に包括的です。機械学習のための最大のTen...

チャット記録をアップロードして自分自身を「複製」する。このスタートアップは「ブラックミラー」の第 1 話を現実のものにしました

10年前に放映されたアメリカのテレビシリーズ「ブラックミラー」の第1話のタイトルは「Be Right...

AI実践者が適用すべき10のディープラーニング手法

過去 10 年間で、機械学習への関心は爆発的に高まりました。ほぼ毎日、さまざまなコンピューターサイエ...

...

...

...

人工知能のセキュリティ:将来の戦争のリスクと課題

人工知能技術の発展に伴い、人工知能はあらゆる分野で広く利用されるようになり、人類社会に広範かつ深遠な...