c#實現(xiàn)哈夫曼樹算法
今天看了一下數(shù)據(jù)結構,一個練習就是構建哈夫曼樹,就順手用C#寫了一個。
static void Main(string[] args)
{
var numbers = new int[] { 1, 3, 3, 3, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7 };
var treeList = new List<HuffmanTree>();
treeList.AddRange(from n in numbers
group n by n into g
select new HuffmanTree { Value = g.Key, Degree = g.Count() });
while (treeList.Count>1)
{
var sel = from i in treeList
orderby i.Degree ascending
select i;
var min = sel.Take(2).ToArray();
treeList.Add(new HuffmanTree { Left = min[0], Right = min[1], Degree = min[0].Degree + min[1].Degree });
treeList.Remove(min[0]);
treeList.Remove(min[1]);
}
}
class HuffmanTree
{
public HuffmanTree Left { get; set; }
public HuffmanTree Right { get; set; }
public int Value { get; set; }
public int Degree { get; set; }
public override string ToString()
{
return Value + " " + Degree;
}
}我用LINQ很直接的寫出了這段代碼,寫完后我都覺得有點吃驚:基本上每一步都只用了一句話完成了,并且都是自注釋的,寫得讓人感覺十分流暢。
雖然這個實現(xiàn)運行效率不高,還有一些可以優(yōu)化的地方,但我卻非常喜歡這種簡潔、高效(開發(fā)效率)的代碼,看著十分舒服。這也是C#的一個十分讓我入迷的地方->優(yōu)雅:可以將心中的想法快速用代碼表現(xiàn)出來,高屋建瓴,一氣呵成,不必于在拘泥于細節(jié)。很多時候,在細節(jié)實現(xiàn)苦苦琢磨的時往往會忘記最開始突發(fā)的靈感和編程的樂趣。
同時我想起了前幾天發(fā)的一個算法練習的帖子,雖然用C#可以在20行之內實現(xiàn),但一大片經(jīng)驗豐富的程序員在4個小時之內用C語言(不能使用任何庫)卻無法完成。我想,對那同一個題目,用20行和用200行實現(xiàn)的時候的人心情是截然不同的吧。
到此這篇關于c#實現(xiàn)哈夫曼樹的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#實現(xiàn)讀取被進程占用的文件實現(xiàn)方法
這篇文章主要介紹了C#實現(xiàn)讀取被進程占用的文件實現(xiàn)方法,涉及C#進程操作及文件讀取的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
Unity 按鈕事件封裝操作(EventTriggerListener)
這篇文章主要介紹了Unity 按鈕事件封裝操作(EventTriggerListener),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#中async await異步關鍵字用法和異步的底層原理全解析
這篇文章主要介紹了C#中async await異步關鍵字用法和異步的底層原理全解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-04-04
C#無法打開計算機“.”上的 IISADMIN 服務的解決方法
在使用c#進行控制IIS服務啟動停止的時候,提示:無法打開計算機“.”上的 IISADMIN 服務2015-01-01

