總結今日心血來潮參加了某廠家的機試,牛客網上機試,一看只有一題且時間90分鐘200分,允許使用本地ide,就知道肯定幾分鐘出不來,看題目可喜的是秒懂哈夫曼編碼,可悲的是一年半以前學的樹圖資料結構都忘光了。
我知道用優先順序佇列+樹可以實現,可是heapq和二叉樹一年多沒用了,只知道用numpy和pandas汗顏,於是慌了一逼。
反正排序用sort()不用自己寫,heapq也好實現,後來怕耗時太多,heapq勉強想起來怎麼用,稍微試了一下,用起來沒問題
from heapq import
*# 輸入,轉化為list
strs =
input()
strs =
[i for i in strs]
# 去重
str_single =
set(strs)
# 按照詞頻入優先順序佇列
hq =
for s in str_single:
(strs.count(s)
,s))
# 初始化明文本典
result =
for i in str_single:
result[i]=''
# 從樹葉往上構建哈夫曼編碼
while hq:
if hq:
# 取兩個最小詞頻的節點,單個字母優先在左邊
if left[0]
== right[0]
:iflen(left[1]
)>
len(right[1]
):left,right = right,left
# 左邊對應編碼加0,非單個單詞比如『cd',那麼對應的c和d的哈夫曼編碼均需要加0
for i in left[1]
: result[i]
+='0'
# 右邊對應編碼加1
for i in right[1]
: result[i]
+='1'
# 把合成節點放入優先佇列
(left[0]
+right[0]
,left[1]
+right[1]
))else
:break
# 最後結果對應哈夫曼編碼是反的,故反轉一下
for k,v in result.items():
v =[i for i in v]
result[k]=''
.join(v[::
-1])
# 輸出結果
for i in strs:
print(''
.join(result[i]
),end=
'')
還是好好再複習一下樹和圖吧,否則連面試機會都沒有,汗顏!! 哈夫曼編碼實現
define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...
實現哈夫曼編碼
include include include include include using namespace std typedef struct node vector nodes 表示結點的指標組 double char number 0 每個字元平均花費的編碼長度 const int cha...
哈夫曼編碼的實現
question.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include stdio.h include stdlib.h define stringsize 30 輸入最大字串的大小 struct bitreenode 構造二叉樹結構體 struct codestack 順...