Java プログラミング スキル - データ構造とアルゴリズム「ハフマン ツリー」

Java プログラミング スキル - データ構造とアルゴリズム「ハフマン ツリー」

[[389315]]

基本的な紹介

n 個のリーフ ノードとして n 個の重みが与えられ、バイナリ ツリーを構築します。ツリーの重み付きパス長 (wpl) が最小化される場合、そのようなバイナリ ツリーは最適バイナリ ツリーと呼ばれ、ハフマン ツリー (Huffman Tree) とも呼ばれ、一部の書籍ではハフマン ツリーと翻訳されています。

ハフマン ツリーは、重み付けされたパスの長さが最も短いツリーであり、重みが大きいノードはルートに近くなります。

いくつかの重要な概念

  1. **パスとパスの長さ: **ツリーでは、ノードから到達できる子ノードまたは孫ノード間のパスをパスと呼びます。パス内の分岐の数をパスの長さと呼びます。ルート ノードのレイヤー数を 1 に設定した場合、ルート ノードから L レイヤー ノードまでのパスの長さは L-1 になります。
  2. **ノードの重みと重み付きパスの長さ: **ツリー内のノードに何らかの意味を持つ数値が割り当てられている場合、この数値はノードの重みと呼ばれます。ノードの重み付きパス長は、ルート ノードからノードまでのパス長とノードの重みの積です。
  3. ツリーの重み付きパス長: ツリーの重み付きパス長は、すべてのリーフ ノードの重み付きパス長の合計、つまり WPL (重み付きパス長) として定義されます。重みが大きいノードがルート ノードに近いバイナリ ツリーが最適なバイナリ ツリーです。
  4. 最小のWPLはハフマン木である

wpl=59はハフマン木である

ハフマンツリー作成のアイデア

シーケンス{13,7,8,3,29,6,1}が与えられた場合、それをハフマン木に変換する必要がある。

  1. 小さいものから大きいものへとソートし、各データをノードと見なし、各ノードは最も単純なバイナリ ツリーと見なすことができます。
  2. ルートノードの重みが最も小さい 2 つのバイナリ ツリーを取り出します。
  3. 新しい二分木が形成され、新しい二分木のルート ノードの重みは、前の 2 つの二分木のルート ノードの重みの合計になります。
  4. 次に、この新しいバイナリ ツリーをルート ノードの重みでソートし、シーケンス内のすべてのデータが処理されてハフマン ツリーが得られるまで、手順 1-2-3-4 を繰り返します。次の図に示すように:

コード例

  1. パッケージ com.xie.huffmantree;
  2.  
  3. java.util.ArrayList をインポートします。
  4. java.util.Collections をインポートします。
  5. java.util.List をインポートします。
  6.  
  7. パブリッククラスHuffmanTree {
  8. 公共 静的void main(String[] args) {
  9. int [] arr = {13, 7, 8, 3, 29, 6, 1};
  10. ノード huffmanTree = createHuffmanTree(arr);
  11. // 事前順序トラバーサル
  12. ハフマンツリーを事前注文します。
  13. /**
  14. * ノード{値=67}
  15. * ノード{値=29}
  16. * ノード{値=38}
  17. * ノード{値=15}
  18. * ノード{値=7}
  19. * ノード{値=8}
  20. * ノード{値=23}
  21. * ノード{値=10}
  22. * ノード{値=4}
  23. * ノード{値=1}
  24. * ノード{値=3}
  25. * ノード{値=6}
  26. * ノード{値=13}
  27. */
  28. }
  29.  
  30. //ハフマン木を作成する
  31. 公共 静的ノードcreateHuffmanTree( int []arr){
  32. //最初のステップは操作を容易にすることです
  33. //1. arr配列を走査する
  34. //2. arrの各要素はノードを形成する
  35. //3. ノードをArrayListに入れる
  36. リスト<Node> nodes = 新しい ArrayList<>();
  37. for ( int値: arr ) {
  38. nodes.add (新しいノード(値));
  39. }
  40.  
  41. ノードサイズ() > 1の場合{
  42. // 小さい順から大きい順に並べ替える
  43. コレクション.sort(ノード);
  44. システム.out.println ( "ノード = " + ノード);
  45.  
  46. // ルートノードの重みが最小の2つのバイナリツリーを取り出します
  47. //(1) 重みが最小のノードを取り出す(二分木)
  48. ノード leftNode = nodes.get(0);
  49. //(2) 2番目に小さい重みを持つノードを取り出す(二分木)
  50. ノード rightNode = nodes.get(1);
  51.  
  52. //(3) 新しいバイナリツリーを構築する
  53. ノード親 = 新しいノード(leftNode.value + rightNode.value);
  54. 親.left = leftNode ;
  55. 親ノードの rightNode をダブルクリックします。
  56.  
  57. //(4) ArrayListから処理済みのバイナリツリーを削除する
  58. ノードを削除します(左ノード)。
  59. ノードを削除します。(右ノード)
  60.  
  61. //(5) ノードに親を追加する
  62. nodes.add (親);
  63. }
  64.  
  65. //ハフマン木のルートノードを返す
  66. nodes.get(0)を返します
  67.  
  68. }
  69.  
  70. 公共 静的void preOrder(Node ノード) {
  71. if (ノード ​​!= null ) {
  72. ノードを事前注文します。
  73. }それ以外{
  74. System.out.println ( "空のツリーなので、走査できません~~" );
  75. }
  76.  
  77. }
  78. }
  79.  
  80. //ノードクラスを作成します。Nodeオブジェクトがソートをサポートするようにするには、Comparableインターフェースを実装します。
  81. クラスNodeはComparable<Node>を実装します。
  82. //重さ
  83. int値;
  84. //左の子ノードを指す
  85. ノード;
  86. //右の子ノードを指す
  87. ノード右;
  88.  
  89. // 事前順序トラバーサルを記述する
  90. パブリックボイドpreOrder() {
  91. System.out.println (これ) ;
  92. if ( this.left != null ) {
  93. this.left.preOrder ();
  94. }
  95.  
  96. if (this.roght != null ) {
  97. this.roght.preOrder();
  98. }
  99. }
  100.  
  101. パブリックノード( int値){
  102. this.value = 値;
  103. }
  104.  
  105. @オーバーライド
  106. パブリック文字列toString() {
  107. 戻る  「ノード{」 +
  108. "値=" + 値 +
  109. '}' ;
  110. }
  111.  
  112. @オーバーライド
  113. 公共  int compareTo(ノードo) {
  114. // 小さい順から大きい順に並べ替える
  115. this.value - o.valueを返します
  116. }
  117. }

【編集者のおすすめ】

  1. 妹に Java 16 の新機能について話しましたが、とても素晴らしいそうです!
  2. IT プロジェクトが多すぎて管理が難しくなっていませんか?いいえ!あなたはまだこの7つのコツを学んでいないからです
  3. Pythonを5年間学んできましたが、これらのウェブサイトをもっと早く知らなかったことを後悔しています。ぜひ一緒に見に来てください。
  4. Java はすでに 16 まで達しているのに、なぜまだ 8 が使われているのでしょうか? どんどん悪化しているのでしょうか?
  5. すごいですね! Windows 10 のこれらのブラックテクノロジー機能を使用したことがありますか?

<<:  人工知能は、いつになったら本当に考えることができるようになるのでしょうか?

>>:  機械学習は2021年にこれらの5つの業界を変革するだろう

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

対称暗号化アルゴリズムと非対称暗号化アルゴリズムの違いは何ですか?

Q: 対称暗号化アルゴリズムと非対称暗号化アルゴリズムの違いは何ですか? 特に暗号化、署名、ハッシ...

液体冷却が高性能コンピューティング インフラストラクチャに関連する課題を克服する方法

新型コロナウイルス感染症の流行から2、3年が経ち、私たちの日常生活の機能を維持するために、データセン...

人工知能はより安全で環境に優しい交通システムの構築に役立つ

人工知能は、運輸業界が直面している多くの複雑な課題を解決するための最適なテクノロジーとなっています。...

BI と AI が出会うとき、「最強の脳」がどのように意思決定を支援するのかを見てみましょう。

ビジネス インテリジェンス (BI) プラットフォームは常に進化しています。企業は、人工知能と機械学...

マイクロソフト、世界規模の公開顔認識データベース MS Celeb を削除

フィナンシャル・タイムズによると、マイクロソフトは、約10万人の1000万枚以上の画像が含まれていた...

AIは生体認証のなりすまし攻撃を簡単に見分けることができる

研究論文によると、写真が実際に生きている人物を写したものか、それとも攻撃のデモンストレーションなのか...

顔認識の専門家、王国天氏:人工知能、機械学習、機械視覚とは何ですか?

昨今、人工知能はますます話題になり、応用されていますが、人工知能、機械学習、マシンビジョンとは一体何...

毎日のアルゴリズム: 完全順列問題

[[435870]]繰り返しのない数字のシーケンスが与えられた場合、そのシーケンスのすべての可能な順...

機械学習で保険ビジネスの問題を簡素化する3つのシナリオ

実際の請求ケースでは、保険会社は個人、シナリオ、さらには他の影響要因を含む大量のデータを使用する必要...

人工知能による仕事の代替

テスラとペイパルの創業者イーロン・マスク氏は、将来私たちのほとんどが職を失うとさえ言っており、人工知...

...

[ディープラーニングシリーズ] PaddlePaddle と Tensorflow を使用したクラシック CNN ネットワーク GoogLeNet の実装

以前、LeNet、AlexNet、Vgg についてお話しましたが、今週は GoogLeNet につい...

マスク氏に敵対的買収の疑い!ツイッター株を受け取ったが取締役会には参加せず、訴訟を起こされている

これはすべて悪意のある計画ですか? ツイッター株を7000万株以上購入した後、マスク氏は取締役会への...

北京で人工知能アイスクリームマシンがデビュー、IBMは「AI + ブロックチェーン」でダイヤモンドを識別

1. 人工知能搭載のアイスクリームセルフサービス機が北京でデビューDairyXmas AI人工知能ア...