Пример #1
0
        private List <HuffmanDicItem> CreateHuffmanDict(string code, HuffmanTreeNode current)
        {
            if (current == null)
            {
                throw new ArgumentNullException();
            }

            List <HuffmanDicItem> result = new List <HuffmanDicItem>();

            if (current.LeftChild == null && current.RightChild == null)
            {
                result.Add(new HuffmanDicItem(current.Data, code));
            }
            else
            {
                List <HuffmanDicItem> dictL = CreateHuffmanDict(code + "0",
                                                                (HuffmanTreeNode)current.LeftChild);
                List <HuffmanDicItem> dictR = CreateHuffmanDict(code + "1",
                                                                (HuffmanTreeNode)current.RightChild);

                result.AddRange(dictL);
                result.AddRange(dictR);
            }
            return(result);
        }
Пример #2
0
        private List <HuffmanDicItem> CreateHuffmanDict(HuffmanTreeNode root)
        {
            if (root == null)
            {
                throw new ArgumentNullException();
            }

            return(CreateHuffmanDict(string.Empty, root));
        }
Пример #3
0
        // 被外界调用的函数,对字符串进行huffman编码。
        public string StringToHuffmanCode(out List <HuffmanDicItem> dict, string str)
        {
            List <HuffmanTreeNode> forest = CreateInitForest(str);
            HuffmanTreeNode        root   = CreateHuffmanTree(forest);

            dict = CreateHuffmanDict(root);
            string result = ToHuffmanCode(str, dict);

            return(result);
        }
Пример #4
0
        private List <HuffmanTreeNode> CreateInitForest(string str)
        {
            if (string.IsNullOrEmpty(str))
            {
                throw new ArgumentNullException();
            }

            List <HuffmanTreeNode> result = new List <HuffmanTreeNode>();

            char[] charArray = str.ToCharArray();
            List <IGrouping <char, char> > lst = charArray.GroupBy(a => a).ToList();

            foreach (IGrouping <char, char> g in lst)
            {
                char            data   = g.Key;
                int             weight = g.ToList().Count;
                HuffmanTreeNode node   = new HuffmanTreeNode(data, weight);
                result.Add(node);
            }
            return(result);
        }
Пример #5
0
        private HuffmanTreeNode CreateHuffmanTree(List <HuffmanTreeNode> sources)
        {
            if (sources == null)
            {
                throw new ArgumentNullException();
            }
            if (sources.Count < 2)
            {
                throw new ArgumentException("构造Huffman树,最少为2个结点。");
            }

            HuffmanTreeNode root   = default(HuffmanTreeNode);
            bool            isNext = true;

            while (isNext)
            {
                List <HuffmanTreeNode> lst = sources.OrderBy(a => a.Weight).ToList();
                HuffmanTreeNode        n1  = lst[0];
                HuffmanTreeNode        n2  = lst[1];
                int weight = n1.Weight + n2.Weight;

                HuffmanTreeNode node = new HuffmanTreeNode(weight);
                node.LeftChild  = n1;
                node.RightChild = n2;

                if (lst.Count == 2)
                {
                    root   = node;
                    isNext = false;
                }
                else
                {
                    sources = lst.GetRange(2, lst.Count - 2);
                    sources.Add(node);
                }
            }
            return(root);
        }