2017-12-05 9 views
-1

私はJavaを学んでいるだけで、ハフマンツリーを作成するプログラムを作成しようとしています。私のBubblesortスクリプトが奇妙な結果を出す

私は、コードの一部が最適化されていないことを知っています(私はそれが終了したら、後でそれを最適化しようとします)、プログラムは終了しませんが、私を悩ます問題は、Bubblesort私が書いたスクリプトは機能せず、間違いを見つけられません。

出力に順序配列を与える必要があります。

私が今までに書いたコードはすべて、あなたがそれを見たいと思った場合に備えて掲載しました。

import java.util.ArrayList; 

abstract class HuffmanTree { 
    public final int frequency; 

    public HuffmanTree(int freq) { 
     frequency = freq; 
    } 


} 

class LeafWrapper { 
    ArrayList<HuffmanLeaf> leafArray = new ArrayList<HuffmanLeaf>(); 

    public LeafWrapper() { 
    } 

    public void setLeafArray(HuffmanLeaf l) { 
     leafArray.add(l); 
    } 

    public void visLeafs() { 
     int i=0; 
     for (HuffmanLeaf l : leafArray) { 
      System.out.println("LeafArray[" + i + "]: " + l); 
      i++; 
     } 
    } 

    public void bubbleSort() { 
     HuffmanLeaf temp; 
     HuffmanLeaf[] leaf = new HuffmanLeaf[leafArray.size()]; 
     leafArray.toArray(leaf); 
     for (int i = 0; i < (leaf.length-1) ; i++) { 
      for (int j = 0; j < leaf.length; j++) { 
       if(leaf[j].frequency<leaf[j+1].frequency){ 
        temp=leaf[j]; 
        leaf[j]=leaf[j+1]; 
        leaf[j+j]=temp; 
       } 
      } 
     } 
//  leafArray.clear(); 
     for (int i = 0; i < leaf.length; i++) { 
      System.out.println(leaf[i]); 
     } 
    } 

    public void frequencyAnalysis(char v[]) { 
     boolean counted; 
     char[] Contato = new char[v.length]; 
     int[] NumChar = new int[v.length]; 
     int n; 
     char c; 
     for(int i=0; i<v.length; i++) { 
      counted=false; 
      for(int j=0; j<v.length; j++) 
       if(v[i] == Contato[j]) 
        counted=true; 
      n = 0; 
      if(counted == false) { 
       c = v[i]; 
       for(int k=0; k<v.length; k++) { 
        if(v[k] == c) 
         n++; 
       } 
       Contato[i] = v[i]; 
       if(Contato[i] != 0) { 
        NumChar[i] = n; 
        System.out.println(Contato[i] + ": " + n); 
       } 
      } 
     } 
     for (int i=0; i<v.length; i++) { 
      if(Contato[i] != 0) 
       leafArray.add(new HuffmanLeaf(NumChar[i], Contato[i])); 
     } 
    } 
} 

class HuffmanLeaf extends HuffmanTree { 
    public final char data; 

    public HuffmanLeaf(int freq, char val) { 
     super(freq); 
     data = val; 
    } 

    public String toString() { 
     return "Leaf: [" + data + ", " + frequency + "]"; 
    } 
} 

class HuffmanNode extends HuffmanTree { 
    public final HuffmanTree left, right; 

    public HuffmanNode(HuffmanTree l, HuffmanTree r) { 
     super(l.frequency + r.frequency); 
     left = l; 
     right = r; 
    } 
} 



class TestHuffman{ 
    public static void main(String[] args) { 
     LeafWrapper HT1 = new LeafWrapper(); 
     String v = "ciao_mamma"; 
     HT1.frequencyAnalysis(v.toCharArray()); 
     System.out.println(" "); 
     HT1.visLeafs(); 
     System.out.println(" "); 
     HT1.bubbleSort();   
    } 

} 

OUTPUTあなたのコード内の2つのバグがあります

LeafArray[0]: Leaf: [c, 1] 
LeafArray[1]: Leaf: [i, 1] 
LeafArray[2]: Leaf: [a, 3] 
LeafArray[3]: Leaf: [o, 1] 
LeafArray[4]: Leaf: [_, 1] 
LeafArray[5]: Leaf: [m, 3] 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
+1

これを読んでください:https://en.wikipedia.org/wiki/Bubble_sort#Pseudocode_implementation – prsvr

+0

この質問にはあまりにも多くのコードがあり、私たちがあなたの問題を見つけるのを困難にしています。あなたの好きなデバッガで時間をかけて、問題を引き起こしていないコードを削除してください。 –

+0

'j == leaf.length - 1'のときは' j + 1 == leaf.length'となり、if節のインデックス付けは 'IndexOutOfBoundsException'で失敗します。 –

答えて

0

for (int i = 0; i < (leaf.length-1) ; i++) { 
    for (int j = 0; j < leaf.length; j++) { // Should be j < leaf.length - 1 
     if(leaf[j].frequency<leaf[j+1].frequency){ 
      temp=leaf[j]; 
      leaf[j]=leaf[j+1]; 
      leaf[j+j]=temp; // RIGHT HERE, should be leaf[j + 1] 
     } 
    } 
} 

基本的には、タイプミスとoff-by-oneエラー。

+0

そして3番目のものは内側の範囲を縮小していません最初の反復の後に、最大のアイテムが最後の位置を占有することはよく知られているが(そして、最初のN回の反復の後にN個の最大のアイテムがN個の最後の位置を占める)、したがってそれらをテストすることは、 。 – CiaPan

+0

^確かに、彼はただの学習だと思っていたので、それを指摘していませんでした。理想的には、最初にバブルソートを書くべきではありません。特に、OPの究極の目的はソートを学ぶのではなく、ハフマンツリーを構築することです。 –