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秒未満で偏微分方程式を解く

ブログ    

推薦する

より強力なLlama 2はオープンソースであり、商用目的で直接使用できます。一夜にして、ビッグモデルの風景は変わりました。

一夜にして、ビッグモデルの状況は再び劇的に変化しました。写真Llama は常に AI コミュニティで...

Beike Renting: 業界に力を与え、レンタル部門の基準の再構築を推進

[原文は51CTO.comより] 国家の不動産市場マクロコントロール政策の導入以来、住宅購入の敷居は...

Google GeminiのRAW画像機能が緊急停止され、その評判は一夜にして崩壊した。ヤン・ルカン「ずっと前からわかっていた」

昨年末、Google Geminiが業界に衝撃を与えた。これはGoogleの「最大、最も有能、最も多...

ユニバーサルで説明可能なAIコンピューティングハードウェア設計は、EDAにおける次の革命的な技術となるでしょう。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

アルトマン:解雇されて戻ってくるのは辛かったが、OpenAIにとっては良いことだ

1月8日、OpenAIのCEOサム・アルトマン氏は、タイム誌編集長とのインタビューで、昨年末に同社と...

6144個のTPU、5400億個のパラメータ、バグ修正、ジョーク解釈など、GoogleはPathwaysを使用して大規模なモデルをトレーニングしました

Google の次世代アーキテクチャ Pathways は、大規模なモデルのトレーニングに使用されて...

自撮り写真でAIがあなたの顔を認識できないようにする方法

現在、顔認識システムがプライベートな写真で訓練されるのを防ぐツールがますます増えている。個人の写真を...

...

機械学習エンジニアとデータサイエンティストの戦い

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

研究者:大規模な言語モデルを微調整すると「セキュリティ」が弱まり、ハッカーによるバックドア攻撃に対して脆弱になる

10月16日、既存の大規模言語モデルをさまざまなユーザーニーズに合わせて修正することで、関連モデルの...

Java プログラミング スキル - データ構造とアルゴリズムの「スタック」

[[387145]]基本的な紹介1. スタックはFILO(先入れ後出し)順序付きリストです2. ス...

建設技術におけるAIは潜在性があるが、まだ現実にはなっていない

建設業界がテクノロジーの導入において他の業界に遅れをとっているのは周知の事実です。 2018年の米国...

インテリジェントロボットを活用してビジネス運営を強化する方法

インテリジェントロボットはビジネスの世界で大きな注目を集めています。スマートロボットの使用には、効率...

マルウェア検出のための機械学習

[[188537]] 1. はじめに機械学習は、コンピュータにデータから学習する能力を与え、現在イ...