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つの業界を変革するだろう

ブログ    
ブログ    

推薦する

百度のロビン・リー氏は、今後10年間は​​人工知能の革新の時代になると述べた。

【CNMOニュース】最近、百度の創業者で会長兼CEOのロビン・リー氏はインド工科大学マドラス校が開...

90年代以降の世代初登場!何凱明と孫建のチームが未来科学賞を受賞し、ResNetは18万回引用された。

先ほど、2023年未来科学賞の受賞者が発表されました!今年の「数学およびコンピューターサイエンス賞」...

人力資源社会保障省:人工知能人材の不足は500万人を超える

最近、人力資源・社会保障省は、新しい職業である人工知能工学・技術人材の現在の雇用状況に関する分析レポ...

Google は一連の大きな動きを発表しました: Gemini Pro は中国語をサポートし、Bard は描画を学習し、新しいモデルが利用可能になりました

この分野で GPT-4 を上回った Bard は「勢いをつかみ」、メジャーアップデートをリリースしま...

実際のシナリオにおける知識グラフに基づく大規模モデル幻覚の原因、評価、緩和戦略の探究

大規模モデルの実用化の問題に関しては、現在業界では大規模モデルを使用して質疑応答を行うのが一般的です...

...

...

テラデータ、Vantage Customer ExperienceとVantage Analystを発表

ユビキタス データ インテリジェンス テクノロジーを提供する世界唯一のプロバイダーである Terad...

農業における人工知能の応用

農業は人類の生存の基盤であり、第三次産業の中核的位置を占め、経済社会の安定と発展に極めて重要な産業で...

...

一般的な基本的なソートアルゴリズムを今回から理解しましょう

[[383742]]この記事はWeChatの公開アカウント「Beta Learns JAVA」から転...

AI はどのようにしてソフトウェアおよびハードウェア製品のイノベーションを実現するのでしょうか? Baidu Brain オープンデー 西安駅の暗号解読

6月25日、「AIによるソフトウェアとハ​​ードウェア製品のイノベーションの促進」をテーマにした西安...

HDビデオは本物ではなく、数枚の写真でレンダリングされた3Dシーンでは本物かどうか判断が難しい。

今日の紹介を始める前に、次のシナリオを見てみましょう。 上記のアニメーションは、複数の写真からレンダ...

NLPの年間進捗状況は年に1回まとめられています。2021年の研究のホットスポットは何でしょうか?

2021 年には、ML と NLP の分野で多くのエキサイティングな進展がありました。 Sebas...