2010-08-18 48 views
1

我正在寫一個需要處理任意二進制文件的huffman壓縮器和解壓縮器(使用C++)。我需要一些數據結構建議。現在,我的壓縮過程如下:霍夫曼編碼的字節頻率表

  • 閱讀以二進制形式的文件的字節到一個char *緩衝區
  • 使用的std ::地圖,計算每個字節模式的頻率在文件中。 (這是我認爲我在尋求麻煩的地方。)
  • 根據頻率直方圖構建二叉樹。每個內部節點都有其子節點的頻率總和,每個葉節點都有一個char *來表示實際的字節。

這是我到目前爲止的地方。

我的問題是,我正在測量,如果我只是使用從char *到int的映射。如果我是正確的,這實際上並不是我需要的。我想我真的在做的是用char *跟蹤實際的4字節指針值。

所以,我打算做的是使用直方圖的地圖和存儲在葉節點的數據的字符。我的邏輯在這裏發聲嗎?我的推理告訴我是的,但由於這是我第一次處理二進制數據,所以我想小心一些只會以奇怪的方式出現的陷阱。

謝謝。

回答

3

你不需要地圖;只有256個可能的值。只需要輸入int freq[256] = {0}並在輸入中爲每個字節添加freq[data[idx]]++即可。

如果你真的想要一張地圖,請使用map<unsigned char, int>;您對使用char*的地圖有懷疑是正確的。

+0

這實際上很有意義。我都是爲了避免調試STL容器錯誤。 – RyanG 2010-08-18 18:32:23

+0

除此之外,地圖實際上具有一定的開銷。每個條目都是一個單獨的堆分配,並且每個查找都包含約lg(N)個指針取消引用。如果你存儲了很多具有間隔很大或者複雜的按鍵的項目,這是非常好的,但是當你可以避開它時,堅持使用數組肯定更好。 – 2010-08-18 19:36:49