哈夫曼编码的非树节点形式实现
生活随笔
收集整理的這篇文章主要介紹了
哈夫曼编码的非树节点形式实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
哈夫曼編碼的非樹節(jié)點(diǎn)形式實(shí)現(xiàn)
- 楔子
- 思考過程
- 于是想自己寫一個headq
- 構(gòu)建二叉樹實(shí)在太久了,完全不讓看文檔,不敢不相信在有限的時間里可以調(diào)試成功,于是就想了使用非樹的實(shí)現(xiàn)方式,就是把手動畫的二叉樹,從樹葉往上補(bǔ)充哈夫曼編碼
- 總結(jié)
楔子
今日心血來潮參加了某廠家的機(jī)試,牛客網(wǎng)上機(jī)試,一看只有一題且時間90分鐘200分,允許使用本地IDE,就知道肯定幾分鐘出不來,看題目可喜的是秒懂哈夫曼編碼,可悲的是一年半以前學(xué)的樹圖數(shù)據(jù)結(jié)構(gòu)都忘光了。
思考過程
我知道用優(yōu)先級隊(duì)列+樹可以實(shí)現(xiàn),可是heapq和二叉樹一年多沒用了,只知道用numpy和pandas汗顏,于是慌了一逼。
于是想自己寫一個headq
反正排序用sort()不用自己寫,heapq也好實(shí)現(xiàn),后來怕耗時太多,heapq勉強(qiáng)想起來怎么用,稍微試了一下,用起來沒問題
構(gòu)建二叉樹實(shí)在太久了,完全不讓看文檔,不敢不相信在有限的時間里可以調(diào)試成功,于是就想了使用非樹的實(shí)現(xiàn)方式,就是把手動畫的二叉樹,從樹葉往上補(bǔ)充哈夫曼編碼
from heapq import * # 輸入,轉(zhuǎn)化為list strs = input() strs = [i for i in strs]# 去重 str_single = set(strs)# 按照詞頻入優(yōu)先級隊(duì)列 hq =[] for s in str_single:heappush(hq,(strs.count(s),s))# 初始化明文字典 result = {} for i in str_single:result[i] = ''# 從樹葉往上構(gòu)建哈夫曼編碼 while hq:left = heappop(hq)if hq:right = heappop(hq)# 取兩個最小詞頻的節(jié)點(diǎn),單個字母優(yōu)先在左邊if left[0] == right[0]:if len(left[1]) > len(right[1]):left,right = right,left# 左邊對應(yīng)編碼加0,非單個單詞比如‘cd',那么對應(yīng)的c和d的哈夫曼編碼均需要加0for i in left[1]:result[i] += '0'# 右邊對應(yīng)編碼加1for i in right[1]:result[i] += '1'# 把合成節(jié)點(diǎn)放入優(yōu)先隊(duì)列heappush(hq,(left[0]+right[0],left[1]+right[1]))else:break# 最后結(jié)果對應(yīng)哈夫曼編碼是反的,故反轉(zhuǎn)一下 for k,v in result.items():v = [i for i in v]result[k] = ''.join(v[::-1]) # 輸出結(jié)果 for i in strs:print(''.join(result[i]),end='')總結(jié)
還是好好再復(fù)習(xí)一下樹和圖吧,否則連面試機(jī)會都沒有,汗顏!!
總結(jié)
以上是生活随笔為你收集整理的哈夫曼编码的非树节点形式实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从GB到GBDT到XGBoost
- 下一篇: 内控平台设计简介