C# 哈夫曼树,编码错误
当我完成我的树时,我非常高兴,但我遇到了编码问题。最频繁的字符没有得到最短的二进制代码。我的推测是递归遍历函数或节点列表的初始化有问题 主程序:C# 哈夫曼树,编码错误,c#,binary-tree,traversal,huffman-code,C#,Binary Tree,Traversal,Huffman Code,当我完成我的树时,我非常高兴,但我遇到了编码问题。最频繁的字符没有得到最短的二进制代码。我的推测是递归遍历函数或节点列表的初始化有问题 主程序: public partial class MainWindow : Window { string kode; public MainWindow() { InitializeComponent(); kode = ""; } public double forhold(int
public partial class MainWindow : Window
{
string kode;
public MainWindow()
{
InitializeComponent();
kode = "";
}
public double forhold(int input, int komprimert)
{
int tall1 = input * 8;
int tall2 = komprimert;
return ((double)tall1 / (double)tall2);
}
public void Traverser(Node rot, string kode) //Traverse the tree
{
if (rot != null)
{
if (rot.Venstre != null) //If the current node has a left child
{
Traverser(rot.Venstre, kode+"0");
}
if (rot.Høyre!= null) //If the current node has a right child
{
Traverser(rot.Høyre, kode+"1");
}
//Viser karakter med koresponderende binær kode
if (rot.Venstre == null && rot.Høyre == null) //If the current node is a leaf
{
rot.kode = kode;
txtOutput.Text += rot.Tegn.ToString() + ": " + kode +", ";
}
}
}
//public Node FåKodeMed //
public void btnKomprimer_Click(object sender, System.Windows.RoutedEventArgs e)
{
string input = txtInput.Text;
bool funnet; //Found
char karakter; //Character
int komprimertLengde; //Not important
txtOutput.Text = "";
komprimertLengde = 0;
if (input.Length == 0)
{
txtOutput.Text = "Du må skrive noe i tekst feltet!";
}
else
{
if (input.Length == 1)
{
txtOutput.Text = "0";
}
if (input.Distinct().Count() == 1)
{
foreach (char c in input)
{
txtOutput.Text += "0";
}
}
else
{
List<Node> noder = new List<Node>(); //List containing nodes
for (int i = 0; i < input.Length; i++) //Places nodes in the tree
{
karakter = input[i];
funnet = false;
for (int j = 0; j< noder.Count; j++)
{
if (noder[j].erTegn(karakter) == false) //Hvis tegnet allerede eksisterer
{
noder[j].økMed1();
funnet = true;
break;
}
}
if (!funnet)
{
noder.Add(new Node(karakter));
}
}
//Sorter listen etter frekvens:
var sortertListe = noder.OrderBy(c => c.Frekvens).ToList(); //Sort the list by frequency
//noder = sortertListe;
do
{
noder.Add(new Node((noder[0].Frekvens + noder[1].Frekvens),noder[0],noder[1])); //Parent node
noder.RemoveAt(0);
noder.RemoveAt(0);
noder.OrderBy(c => c.Frekvens).ToList();
}while(noder.Count >= 2);
Node rot = new Node(noder[0]);
Traverser(rot, "");
//Feilen kan ligge her
List<string> output = new List<string>();
foreach (char c in input)
{
for (int i = 0; i < sortertListe.Count;i++)
{
if(sortertListe[i].Tegn == c)
{
output.Add(sortertListe[i].kode);
break;
}
}
}
txtOutput.Text += "\n" + "\n";
foreach (string s in output)
{
txtOutput.Text += s;
}
foreach (string c in output)
{
komprimertLengde += c.Length;
}
txtOutput.Text += "\n" + "\n";
txtOutput.Text += "lengde på input: " + Convert.ToString((input.Length * 8)) + "\n";
txtOutput.Text += "Lengde på komprimert: " + Convert.ToString(komprimertLengde) + "\n";
txtOutput.Text += "Forholdet: " + Convert.ToString(forhold(input.Length,komprimertLengde));
noder.Clear();
}
}
}
我认为这里已经提供了整个解决方案 代码中的问题主要是由于排序列表实际上是按错误的顺序排序的。您可能想使用
.OrderByDescending
但是,您也可以尝试其他解决方案。例如,考虑实现优先级队列
注意:下次请使用英语,即使谷歌翻译让我感到困惑:-)提示:如果您计划向任何人显示您的源代码,请在代码中仅使用英语标识符-无论您的国籍如何。我没有挪威键盘,所以如果我想修改你的代码,我不能轻易地输入标识符“Høyre”。此外,使用非英语标识符,分析代码要困难得多。
noder.OrderBy(c=>c.Frekvens.ToList()代码>-不应该是noder=noder.OrderBy(c=>c.Frekvens.ToList()代码>?@Spook是的,Spook,你完全正确。我决定从现在起,我将用英语书写所有变量名:D@500-是的,当然,愚蠢的错误是的,谢谢你的回答!实际上,在我的学校,我们用挪威语进行变量命名(我认为这不是很好的编程实践),但在过去的几个月里,我强迫自己用英语写所有的东西=)
.OrderByDescending