霍夫曼树和节点的发生顺序

时间:2018-06-09 21:45:57

标签: java huffman-code

我正在尝试为哈夫曼编码实现一个算法,我现在有一个非常简单的代码可以正常工作。在我的代码中,角色的权重取决于该角色的出现频率,但是我想对其进行改进,使其符合以下条件:

我希望我的代码能够考虑遇到节点的顺序。例如,如果'e'和''具有相同的频率,但'e'首先出现,其权重将被认为更大。我一直在尝试为我的代码实现这个,但它似乎给了我不同的结果。

这就是我所拥有的。关于如何解决这个问题的任何意见将不胜感激。如果这太简单了,我会事先道歉,但我还是学生,还在学习。

import java.util.ArrayList;

public class Huffman {

static Node node;
static Node newRoot;
static String codedString = "";

public static void main(String[] args) {

    String message = "'twas brillig, and the slithy toves  did gyre and gimble in the wabe:  all mimsy were the borogoves,  and the mome raths outgrabe.  "
            + "\"beware the jabberwock, my son!  the jaws that bite, the claws that catch!  beware the jubjub bird, and shun  the frumious bandersnatch!\"  "
            + "he took his vorpal sword in hand:  long time the manxome foe he sought --  so rested he by the tumtum tree,  and stood awhile in thought.  "
            + "and, as in uffish thought he stood,  the jabberwock, with eyes of flame,  came whiffling through the tulgey wood,  and burbled as it came!  "
            + "one, two! one, two! and through and through  the vorpal blade went snicker-snack!  he left it dead, and with its head  he went galumphing back.  "
            + "\"and, has thou slain the jabberwock?  come to my arms, my beamish boy!  o frabjous day! callooh! callay!\" "
            + " he chortled in his joy.  'twas brillig, and the slithy toves  did gyre and gimble in the wabe; "
            + " all mimsy were the borogoves,  and the mome raths outgrabe.";

    // Convert the string to char array

    char[] msgChar = message.toCharArray();
    ArrayList<Character> characters = new ArrayList<Character>();

    /*
     * Get a List of all the chars which are present in the string No
     * repeating the characters!
     */
    for (int i = 0; i < msgChar.length; i++) {
        if (!(characters.contains(msgChar[i]))) {
            characters.add(msgChar[i]);
        }
    }

    /* Print out the available characters */
    // System.out.println(characters);

    /* Count the number of occurrences of Characters */
    int[] countOfChar = new int[characters.size()];

    /* Fill The Array Of Counts with one as base value */
    for (int x = 0; x < countOfChar.length; x++) {
        countOfChar[x] = 0;
    }

    /* Do Actual Counting! */
    for (int i = 0; i < characters.size(); i++) {
        char checker = characters.get(i);
        for (int x = 0; x < msgChar.length; x++) {
            if (checker == msgChar[x]) {
                countOfChar[i]++;
            }
        }
    }

    /* Sort the arrays is descending order */
    for (int i = 0; i < countOfChar.length - 1; i++) {
        for (int j = 0; j < countOfChar.length - 1; j++) {
            if (countOfChar[j] < countOfChar[j + 1]) {
                int temp = countOfChar[j];
                countOfChar[j] = countOfChar[j + 1];
                countOfChar[j + 1] = temp;

                char tempChar = characters.get(j);
                characters.set(j, characters.get(j + 1));
                characters.set(j + 1, tempChar);
            }
        }
    }

    /* Print Out The Frequencies of the Characters */
    for (int x = 0; x < countOfChar.length; x++) {
        System.out.println(characters.get(x) + " - " + countOfChar[x]);
    }

    /* Form the Tree! */

    /* Form Leaf Nodes and Arrange them in a linked list */

    Node root = null;
    Node current = null;
    Node end = null;

    for (int i = 0; i < countOfChar.length; i++) {
        Node node = new Node(characters.get(i).toString(), countOfChar[i]);
        if (root == null) {
            root = node;
            end = node;
        } else {
            current = root;
            while (current.linker != null) {
                current = current.linker;
            }
            current.linker = node;
            current.linker.linkerBack = current;
            end = node;
        }
    }

    // Recursively add and make nodes!
    TreeMaker(root, end);

    // inOrder(root);
    System.out.println();
    inOrder(node);

    // preOrder(root);
    System.out.println();
    preOrder(node);

    // Calculate the ends and the meets!
    char[] messageArray = message.toCharArray();
    char checker;

    for (int i = 0; i < messageArray.length; i++) {
        current = node;
        checker = messageArray[i];
        String code = "";
        while (true) {
            if (current.left.value.toCharArray()[0] == checker) {
                code += "0";
                break;
            } else {
                code += "1";
                if (current.right != null) {
                    if (current.right.value.toCharArray()[0] == characters
                            .get(countOfChar.length - 1)) {
                        break;
                    }
                    current = current.right;
                } else {
                    break;
                }
            }
        }
        codedString += code;
    }
    System.out.println();
    System.out.println("The coded string is " + codedString);
}

public static void preOrder(Node root) {

    if (root != null) {

        System.out.print(root.value + "->");
        preOrder(root.left);
        preOrder(root.right);

    }

}

public static void inOrder(Node root) {

    if (root != null) {
        inOrder(root.left);
        System.out.print(root.value + "->");
        inOrder(root.right);
    }

}

public static void TreeMaker(Node root, Node end) {
    node = new Node(end.linkerBack.value + end.value, end.linkerBack.count
            + end.count);
    node.left = end.linkerBack;
    node.right = end;
    end.linkerBack.linkerBack.linker = node;
    node.linkerBack = end.linkerBack.linkerBack;
    end = node;
    end.linker = null;
    Node current = root;

    while (current.linker != null) {
        System.out.print(current.value + "->");
        current = current.linker;
    }

    System.out.println(current.value);

    if (root.linker == end) {
        node = new Node(root.value + end.value, root.count + end.count);
        node.left = root;
        node.right = end;
        node.linker = null;
        node.linkerBack = null;
        System.out.println(node.value);
        newRoot = node;
    } else {
        TreeMaker(root, end);
    }
}

}

class Node {

String value;
int count;
Node left;
Node right;
Node linker;
Node linkerBack;

Node(String value, int count) {

    this.value = value;
    this.count = count;
    this.left = null;
    this.right = null;
    this.linker = null;
    this.linkerBack = null;

}

}

0 个答案:

没有答案