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

ブログ    
ブログ    

推薦する

ディープニューラルネットワークを使用してNER固有表現抽出の問題を解決する

この記事は次のように構成されています。固有表現抽出 (NER) とはどのように識別しますか? cs2...

...

可用性の高い Java 分散システムの構築: システムの安定性と信頼性の確保

今日のインターネット アプリケーション開発では、可用性の高い分散システムを構築することが、システムの...

機械学習の仕事を探すとき、学歴はどの程度重要ですか?

[[254426]]機械学習の分野における知識とツールの主な特徴は、無料かつオープンであることです...

2020年グローバルNLP業界レポート:NLPテクノロジー予算が30%増加

2020 年は、公衆衛生、職業生活、経済、そして日常生活のほぼすべての側面にとって特別な年となりまし...

Forbes: 14 人の技術専門家が、将来 AI によって混乱が生じる業界を予測しています。

AI の恩恵を受ける業界はどれでしょうか?人工知能と機械学習はすでにさまざまな業界に導入されており...

ガートナー:AIと自動化は次世代SASEの重要な機能となる

近年、セキュア アクセス サービス エッジ (SASE) テクノロジーは急速に発展し、産業界で広く使...

専門家レベルの機械学習ツールの推奨事項。専門家と同じものを入手しましょう。

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

うつ病に苦しむ5400万人の人々に直面し、600人のボランティアはAIを使って彼らを救うつもりだ

2019年、21歳の中国人学生、李凡は自身の微博に書き込みをした後、薬を飲んで自殺した。その後の調査...

人工知能のヒューマニズム:AIをより愛らしくする方法

1. デジタル格差が拡大し、高齢者は「デジタル難民」となっている最近、高齢者に関する2つのニュース...

検索アルゴリズムはあなたの指先にあります: GitHubには最大のオープンソースアルゴリズムライブラリがあります

[[433085]]アルゴリズムは本質的に、1 つ以上の入力を受け入れ、内部計算とデータ操作を実行...

...

AI技術は製薬業界でますます重要な役割を果たしている

製薬会社における人工知能 (AI) の活用は、より優れた診断の提供、より高品質の医薬品の開発、患者に...

...