Beispiel #1
0
        private static void BuildTree()
        {
            HuffmanTrees.Sort();
            while (HuffmanTrees.Count > 1)
            {
                var parent = new HuffmanTree();
                if (HuffmanTrees[0].Frequency > HuffmanTrees[1].Frequency)
                {
                    HuffmanTrees.Sort();
                }
                var min       = HuffmanTrees[0];
                var secondMin = HuffmanTrees[1];

                if (parent.LeftChild == null)
                {
                    parent.LeftChild = min;
                    min.Parent       = parent;
                    HuffmanTrees.Remove(min);
                }
                if (parent.RightChild == null)
                {
                    parent.RightChild = secondMin;
                    secondMin.Parent  = parent;
                    HuffmanTrees.Remove(secondMin);
                }

                parent.Frequency = min.Frequency + secondMin.Frequency;
                HuffmanTrees.Insert(0, parent);
            }

            if (HuffmanTrees != null || HuffmanTrees[0].Parent == null)
            {
                Root = HuffmanTrees[0];
            }
        }
Beispiel #2
0
        public static SortedSet <string> Encode(string input)
        {
            HuffmanTrees = input
                           .GroupBy(c => c)
                           .Select(o => new HuffmanTree(o.Key, o.Count()))
                           .OrderBy(n => n.Frequency)
                           .ThenBy(n => n.Character).ToList();
            Nodes = HuffmanTrees.ToArray <HuffmanTree>();

            BuildTree();
            Traverse(Root, 1);

            var set = new SortedSet <string>();

            foreach (var c in input)
            {
                var code = Array.Find(Nodes, n => n.Character == c).Binary;
                set.Add(code);
            }

            return(set);
        }