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

ブログ    
ブログ    

推薦する

コンテンツ推奨シナリオにおける自己教師学習の応用

背景機械学習コミュニティでは、教師なし学習(または自己教師あり学習)は長い間、最も価値のある分野の ...

2018 年のベスト 6 無料オンライン人工知能コース!

人工知能 (AI)、自動化、認知システムを取り巻く原則と実践は、ビジネス分野、専門知識、専門分野に関...

2022年のAI時代、将来のトレンドに関する洞察

Appleの携帯電話に搭載されているインテリジェントなパーソナル音声アシスタントSiriから、Alp...

これは本当に天才的ですね!パーセプトロンを組み合わせると、ニューラル ネットワークになるのではないでしょうか。

[[354709]]みなさんこんにちは。今日もディープラーニングについてお話していきましょう。クラ...

...

NVIDIA の最も強力な汎用大型モデル Nemotron-4 が登場! 15Bが62Bに勝ち、ターゲットはA100/H100です。

最近、NVIDIA チームは、8T トークンでトレーニングされた 150 億のパラメータを持つ新しい...

AI を活用した検索と推奨はどれほど強力でしょうか?

著者 | ユン・チャオユーザーと情報の間には、検索か推奨のいずれかが存在します。百度の執行副社長であ...

人間の脳神経を模倣してAIを開発!ケンブリッジ大学の最新研究がネイチャー誌に掲載:人工脳がAIの新たな方向性となる

地球上で最も複雑な知能の担い手である人間の脳の最大の特徴の 1 つは、高いエネルギー効率で知能を生み...

AIテキスト翻訳システムの品質が44%向上し、500億以上のパラメータを使用して200の言語を翻訳

Meta Platforms は本日、Meta が社内開発した、200 言語のテキストを翻訳できる人...

アルゴリズム技術の向上とアルゴリズムの適用の標準化(デジタル時代の文化生活)

[[399442]]アルゴリズム技術を改善し、アルゴリズムの適用を標準化することによってのみ、技術...

2018年に人工知能がビジネスに及ぼす10のインパクト

[[220065]]人工知能 (AI) と機械学習は多くの企業にとって流行語となっていますが、これら...

12以上の学習リソースを検討した後、このAI学習パスをまとめました。

[[276295]]タグ: AI、機械学習、ディープラーニング一言でまとめると、AI の分野に参入...

Google がニューラル ネットワーク コーデック SoundStream を発表、オープンソース プロジェクト Lyra に統合される予定

Google は最近、エンドツーエンドのニューラル オーディオ コーデックである SoundStre...

機械は人間に取って代わるでしょうか?人工知能技術の倫理的リスクを解明する

現在の人工知能技術の発展は、主にコンピュータを媒体として活用し、自動化技術の発展を促進しています。デ...