Ejemplo n.º 1
0
        public void Hafman()
        {
            /*Построение таблицы кодов*/
                List<Node> tree = new List<Node>();
                foreach (Symbol t in abc)
                {
                    Node temp = new Node();
                    temp.element.Add(t);
                    temp.comute();
                    tree.Add(temp);
                }

                List<Node> nodes = new List<Node>();
                foreach (Node t in tree)
                {
                     nodes.Add(t);
                }
                HafmanTree(ref tree);

            foreach (Node t in nodes)
            {
                Node temp = t;
                int index=Search(t.element[0].character + "");
                int i = 0;
                while (temp.element.Count != abc.Count)
                {
                    abc[index].code += temp.bit;
                    temp = temp.parent;

                    i++;
                    //if (i==4)
                       // MessageBox.Show(temp.sumChance+ "");

                }

                char[] arr = abc[index].code.ToCharArray();
                Array.Reverse(arr);
                abc[index].code=new string(arr);
            }
        }
Ejemplo n.º 2
0
        public void HafmanTree(ref List<Node> tree)
        {
            bool flag = false;
            foreach (Node t in tree) {
                if (t.element.Count == abc.Count)
                    flag = true;
                //MessageBox.Show(t.element.Count + "");

            }
            if (flag)
                return;
            /*Выбор  новой вершины дерева, формирование дерева*/
            Node min1=null, min2=null;
            foreach (Node t in tree)
            {
                if (!t.flag)
                {
                    min1 = t;
                    break;
                }

            }
            foreach (Node t in tree)
            {
                if (!t.flag && t != min1)
                {
                    min2 = t;
                    break;
                }

            }
            foreach (Node t in tree)
            {
                if (t.sumChance < min1.sumChance && t != min2 && !t.flag)
                    min1 = t;

            }
            foreach (Node t in tree)
            {
                if (t.sumChance < min2.sumChance && t != min1 && !t.flag)
                    min2 = t;

            }

            Node z = new Node();
            foreach (Symbol t in min1.element)
            {
                z.element.Add(t);

            }
            foreach (Symbol t in min2.element)
            {
                z.element.Add(t);

            }
            z.comute();

            min1.parent = z;
            min2.parent = z;
            min1.bit = "0";
            min2.bit = "1";
            min1.flag = true;
            min2.flag = true;

            tree.Add(z);
               //
            HafmanTree(ref tree);
        }