object[] GatherCodes(Tree.Node root) { indexDGV = 0; CurrentCost = 0f; Gardener(root.children[0], "0"); Gardener(root.children[1], "1"); return(null); }
//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); }
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); } }
Tree.Node MakeNode(Tree.Node n1, Tree.Node n2) { return(new Tree.Node('#', n1.p + n2.p)); }