日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈夫曼编码的非树节点形式实现

發布時間:2024/9/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈夫曼编码的非树节点形式实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

  • 楔子
  • 思考過程
    • 于是想自己寫一個headq
    • 構建二叉樹實在太久了,完全不讓看文檔,不敢不相信在有限的時間里可以調試成功,于是就想了使用非樹的實現方式,就是把手動畫的二叉樹,從樹葉往上補充哈夫曼編碼
  • 總結

楔子

今日心血來潮參加了某廠家的機試,牛客網上機試,一看只有一題且時間90分鐘200分,允許使用本地IDE,就知道肯定幾分鐘出不來,看題目可喜的是秒懂哈夫曼編碼,可悲的是一年半以前學的樹圖數據結構都忘光了。

思考過程

我知道用優先級隊列+樹可以實現,可是heapq和二叉樹一年多沒用了,只知道用numpy和pandas汗顏,于是慌了一逼。

于是想自己寫一個headq

反正排序用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:heappush(hq,(strs.count(s),s))# 初始化明文字典 result = {} for i in str_single:result[i] = ''# 從樹葉往上構建哈夫曼編碼 while hq:left = heappop(hq)if hq:right = heappop(hq)# 取兩個最小詞頻的節點,單個字母優先在左邊if left[0] == right[0]:if len(left[1]) > len(right[1]):left,right = right,left# 左邊對應編碼加0,非單個單詞比如‘cd',那么對應的c和d的哈夫曼編碼均需要加0for i in left[1]:result[i] += '0'# 右邊對應編碼加1for i in right[1]:result[i] += '1'# 把合成節點放入優先隊列heappush(hq,(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='')

總結

還是好好再復習一下樹和圖吧,否則連面試機會都沒有,汗顏!!

總結

以上是生活随笔為你收集整理的哈夫曼编码的非树节点形式实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。