Example #1
0
        object[] GatherCodes(Tree.Node root)
        {
            indexDGV    = 0;
            CurrentCost = 0f;
            Gardener(root.children[0], "0");
            Gardener(root.children[1], "1");

            return(null);
        }
Example #2
0
        //protected const string SYMBOLS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        //public static int BFromString(string code, int NumberBase)
        //{
        //    int n = code.Length;
        //    int value = 0;
        //    for (int i = 0; i < n; i++)
        //    {
        //        value += SYMBOLS.IndexOf(code[i]) * (int)Math.Pow(NumberBase, i);
        //    }

        //    return value;
        //}

        #region №1 - huffman
        private void buttonHuffman_Click(object sender, EventArgs e)
        {
            dgv1.Rows.Clear();

            tree = new Tree();
            Tree.Node[] leaves;

            BuildPairs();

            // less freaquent will be first ones
            Array.Sort(pairs, new Comparison <KeyValuePair <char, float> >(
                           delegate(KeyValuePair <char, float> a, KeyValuePair <char, float> b)
            {
                return(a.Value.CompareTo(b.Value));
            }
                           )
                       );

            // create leaves, a less freaquent leaf goes first
            leaves = new Tree.Node[pairs.Length];
            for (int i = 0; i < pairs.Length; i++)
            {
                leaves[i]   = new Tree.Node();
                leaves[i].k = pairs[i].Key;
                // TODO count total probability and let last leave's p to be = (1 - sum)
                leaves[i].p = pairs[i].Value;// / (float)textBoxMsg.TextLength;
            }

            int index = 0;

            while (index < pairs.Length - 1)
            {
                Tree.Node n = MakeNode(leaves[index], leaves[index + 1]);
                n.children.Add(leaves[index]);
                n.children.Add(leaves[index + 1]);

                leaves[index]     = new Tree.Node();
                leaves[index + 1] = n;

                // TODO вынести безымянный метод отдельно чтоб не new
                Array.Sort(leaves, new Comparison <Tree.Node>(
                               delegate(Tree.Node a, Tree.Node b)
                {
                    return(a.p.CompareTo(b.p));
                }
                               ));

                index++;
            }

            GatherCodes(leaves[pairs.Length - 1]);

            UpdateHR(CurrentCost);
        }
Example #3
0
 void Gardener(Tree.Node node, string prefix)
 {
     if (node.children.Count > 0)
     {
         Gardener(node.children[0], prefix + "0");
         Gardener(node.children[1], prefix + "1");
     }
     else
     {
         // its leaf
         dgv1.Rows.Add();
         dgv1[0, indexDGV].Value = node.k;
         dgv1[1, indexDGV].Value = node.p.ToString("F3");
         dgv1[2, indexDGV].Value = prefix;
         indexDGV++;
         CurrentCost += node.p * prefix.Length;
         //listBox1.Items.Add("Node: "+node.k + " --> " + prefix);
     }
 }
Example #4
0
 Tree.Node MakeNode(Tree.Node n1, Tree.Node n2)
 {
     return(new Tree.Node('#', n1.p + n2.p));
 }