哈夫曼編碼的非樹節點形式實現

2021-10-05 05:13:18 字數 1400 閱讀 9612

總結今日心血來潮參加了某廠家的機試,牛客網上機試,一看只有一題且時間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 順...