⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffmantree.java

📁 这是一个huffmanCode算法
💻 JAVA
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package lab6;import java.io.*;import java.util.*;;/** * * @author Administrator */public class HuffmanTree{     //添加类HuffmanTree中包含的变量。     ArrayList<HuffmanTree> minHeap = new ArrayList<HuffmanTree>();//最小堆     ArrayList<HuffmanTree> output = new ArrayList<HuffmanTree>(); //输出链表     HuffmanTree[] tree = new HuffmanTree[32];//构造最后标数字时候的树     HuffmanTree parentNode;//构造父节点,左儿子,右儿子和根节点。     HuffmanTree leftNode;     HuffmanTree rightNode;     HuffmanTree root;     int freq;     int Char;     String huffmanCode;     int heap_size;         /* Construct method */    public HuffmanTree() {        freq = 0;        huffmanCode = "";    /* add your code here */    }//初始化。    /* Generate the HuffmanTree according to the given frequency */    public void HUFFMAN(int[] C) {        for(int i = 0;i < C.length;i++){            if (C[i] != 0)            {                HuffmanTree tmp = new HuffmanTree();                tmp.setFreq(C[i]);                tmp.setChar(i);                minHeap.add(tmp);            }        }        int n = minHeap.size();        buildMinHeap();//建立最小堆。        for (int i = 0; i < n - 1; i++) {            HuffmanTree  z = new HuffmanTree();            HuffmanTree  x = new HuffmanTree();            HuffmanTree  y = new HuffmanTree();            x = extractMin();            z.leftNode = x;            y = extractMin();            z.rightNode = y;            y.parentNode = z;            x.parentNode = z;            z.setFreq( x.getFreq() + y.getFreq());            insert(z);        }        root = extractMin();        root.parentNode = null;    }    /* Print out the resulting representation */    PrintWriter out;    public void printHuffmanTree() {       getHuffmanCode(root);        File file = new File("Hugefile.txt");        try {            out = new PrintWriter(new FileWriter(file));            out.println("Char\tFreq\tRepresentation");            for(int i = 0;i < count;i++)                out.println(""+(char)output.get(i).getChar()+"\t"+output.get(i).getFreq()+"\t"+output.get(i).huffmanCode);        } catch (IOException e) {            e.printStackTrace();        }        try{            out.close();        }        catch(Exception e){            e.printStackTrace();        }        /* add your code here */        return;    }     public void add(HuffmanTree ht){        for(int i = 0;i < tree.length;i++){            if(tree[i] == null){                tree[i] = ht;                break;            }        }    }    public HuffmanTree extract(){       HuffmanTree ret = tree[0];       for(int i = 0;i < tree.length - 1 && tree[i] != null;i++)           tree[i] = tree[i + 1];       return ret;    }    public boolean isEmpty(){        boolean ret = true;        for(int i = tree.length - 1;i >= 0;i--){            if(tree[i] != null){                ret = false;                break;            }        }        return ret;    }    //HuffmanTree中的方法    public void setChar(int Char){        this.Char = Char;    }    public int getChar(){        return Char;    }    public void setFreq(int freq){        this.freq = freq;    }    public int getFreq(){        return freq;    }    //MINUMHEAP中的方法    public int parent(int i) {        return (int)((i + 1) / 2 - 1);    }    public int left(int i) {        return 2 * (i + 1) - 1;    }    public int right(int i) {        return 2 * (i + 1);    }    public void minHeapify(int i) {        int left = left(i);        int right = right(i);        int smallest = i;        if (left <= heap_size && minHeap.get(left).getFreq() < minHeap.get(i).getFreq()) {            smallest = left;        } else {            smallest = i;        }        if (right <= heap_size && minHeap.get(right).getFreq() < minHeap.get(i).getFreq()) {            smallest = right;        }        if (smallest != i) {            HuffmanTree tmp = minHeap.get(i);            minHeap.set(i,minHeap.get(smallest));            minHeap.set(smallest,tmp);            minHeapify(smallest);        }    }    public void buildMinHeap(){        heap_size = minHeap.size() - 1;        for (int i = minHeap.size() / 2; i >= 0; i--) {            minHeapify(i);        }    }    public HuffmanTree extractMin() {        if (heap_size < 0) {            System.out.println("ERROR :heap underflow!");        }        HuffmanTree min = minHeap.get(0);        minHeap.set(0,minHeap.get(heap_size));        heap_size--;        minHeapify(0);        return min;    }    public void heapDecreaseKey(int i, HuffmanTree key) {        if (key.getFreq() > minHeap.get(i).getFreq()) {            System.out.println("ERROR :new key is larger than current key!");        }        minHeap.set(i,key);        while (i > 0 && minHeap.get(parent(i)).getFreq() > minHeap.get(i).getFreq()) {            HuffmanTree tmp = minHeap.get(i);            minHeap.set(i,minHeap.get(parent(i)));            minHeap.set(parent(i),tmp);            i = parent(i);        }    }    public void insert(HuffmanTree key) {        heap_size++;        HuffmanTree tmp = new HuffmanTree();        tmp.setFreq(Integer.MAX_VALUE);        minHeap.set(heap_size,tmp);        heapDecreaseKey(heap_size, key);    }    // 在树里面添加元素HuffmanTree,并产生HuffmanCode。    int count;    public void getHuffmanCode(HuffmanTree rootNode) {        add(rootNode);        while (!isEmpty()) {            HuffmanTree o = extract();            HuffmanTree l = o.leftNode;            HuffmanTree r = o.rightNode;            if (l != null) {                add(l);                l.huffmanCode = "0";            }            if (r != null) {                add(r);                r.huffmanCode = "1";            }            if ((l == null) && (r == null)){                HuffmanTree p = o.parentNode;                while (p != null) {                    o.huffmanCode += p.huffmanCode;                    p = p.parentNode;                }                if (o.huffmanCode != null) {                    StringBuffer buffer = new StringBuffer(o.huffmanCode);                    buffer = buffer.reverse();                    o.huffmanCode = buffer.toString();                }                output.add(o);                count++;            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -