pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

存儲哈夫曼樹的有效方式

Efficient way of storing Huffman tree(存儲哈夫曼樹的有效方式)
本文介紹了存儲哈夫曼樹的有效方式的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在編寫一個霍夫曼編碼/解碼工具,并且正在尋找一種有效的方法來存儲為存儲在輸出文件中而創建的霍夫曼樹.

I am writing a Huffman encoding/decoding tool and am looking for an efficient way to store the Huffman tree that is created to store inside of the output file.

目前我正在實施兩個不同的版本.

Currently there are two different versions I am implementing.

  1. 這個將整個文件逐個字符讀入內存,并為整個文件建立一個頻率表.這只需要輸出一次樹,因此效率不是那么大,除非輸入文件很小.
  2. 我使用的另一種方法是讀取一塊大小約為 64 KB 的數據,然后對其運行頻率分析,創建一棵樹并對其進行編碼.但是,在這種情況下,在每個塊之前,我需要輸出我的頻率樹,以便解碼器能夠重新構建其樹并正確解碼編碼文件.這是效率確實發揮作用的地方,因為我想節省盡可能多的空間.

到目前為止,在我的搜索中,我還沒有找到在盡可能小的空間內存儲樹的好方法,我希望 StackOverflow 社區可以幫助我找到一個好的解決方案!

In my searches so far I have not found a good way of storing the tree in as little space as possible, I am hoping the StackOverflow community can help me find a good solution!

推薦答案

由于您已經需要實現代碼來處理字節組織流/文件之上的逐位層,因此這是我的建議.

Since you already have to implement code to handle a bit-wise layer on top of your byte-organized stream/file, here's my proposal.

不要存儲實際頻率,解碼不需要它們.但是,您確實需要實際的樹.

Do not store the actual frequencies, they're not needed for decoding. You do, however, need the actual tree.

所以對于每個節點,從根開始:

So for each node, starting at root:

  1. 如果葉子節點:輸出 1 位 + N 位字符/字節
  2. 如果不是葉子節點,則輸出 0 位.然后以相同的方式編碼兩個子節點(先左后右)

要閱讀,請執行以下操作:

To read, do this:

  1. 讀取位.如果為 1,則讀取 N 位字符/字節,返回其周圍沒有子節點的新節點
  2. 如果 bit 為 0,以同樣的方式解碼左右子節點,并返回帶有這些子節點的新節點,但沒有值

葉節點基本上是任何沒有子節點的節點.

A leaf-node is basically any node that doesn't have children.

使用這種方法,您可以在寫入之前計算輸出的確切大小,以確定收益是否足以證明付出的努力.這假設您有一個包含每個字符出現頻率的鍵/值對字典,其中頻率是實際出現的次數.

With this approach, you can calculate the exact size of your output before writing it, to figure out if the gains are enough to justify the effort. This assumes you have a dictionary of key/value pairs that contains the frequency of each character, where frequency is the actual number of occurrences.

計算偽代碼:

Tree-size = 10 * NUMBER_OF_CHARACTERS - 1
Encoded-size = Sum(for each char,freq in table: freq * len(PATH(char)))

樹大小計算考慮了葉子節點和非葉子節點,內聯節點比字符少一個.

The tree-size calculation takes the leaf and non-leaf nodes into account, and there's one less inline node than there are characters.

SIZE_OF_ONE_CHARACTER 將是位數,這兩個將為您提供我對樹的方法 + 編碼數據將占用的總位數.

SIZE_OF_ONE_CHARACTER would be number of bits, and those two would give you the number of bits total that my approach for the tree + the encoded data will occupy.

PATH(c) 是一個函數/表,它會產生從根到樹中那個字符的位路徑.

PATH(c) is a function/table that would yield the bit-path from root down to that character in the tree.

這是一個看起來像 C# 的偽代碼,它假設一個字符只是一個簡單的字節.

Here's a C#-looking pseudo-code to do it, which assumes one character is just a simple byte.

void EncodeNode(Node node, BitWriter writer)
{
    if (node.IsLeafNode)
    {
        writer.WriteBit(1);
        writer.WriteByte(node.Value);
    }
    else
    {
        writer.WriteBit(0);
        EncodeNode(node.LeftChild, writer);
        EncodeNode(node.Right, writer);
    }
}

讀回:

Node ReadNode(BitReader reader)
{
    if (reader.ReadBit() == 1)
    {
        return new Node(reader.ReadByte(), null, null);
    }
    else
    {
        Node leftChild = ReadNode(reader);
        Node rightChild = ReadNode(reader);
        return new Node(0, leftChild, rightChild);
    }
}

示例(簡化、使用屬性等)節點實現:

An example (simplified, use properties, etc.) Node implementation:

public class Node
{
    public Byte Value;
    public Node LeftChild;
    public Node RightChild;

    public Node(Byte value, Node leftChild, Node rightChild)
    {
        Value = value;
        LeftChild = leftChild;
        RightChild = rightChild;
    }

    public Boolean IsLeafNode
    {
        get
        {
            return LeftChild == null;
        }
    }
}

<小時>

這是一個特定示例的示例輸出.


Here's a sample output from a specific example.

輸入:AAAAAABCCCCCCDDEEEEE

Input: AAAAAABCCCCCCDDEEEEE

頻率:

  • 答:6
  • 乙:1
  • C:6
  • D:2
  • E:5

每個字符只有 8 位,因此樹的大小將為 10 * 5 - 1 = 49 位.

Each character is just 8 bits, so the size of the tree will be 10 * 5 - 1 = 49 bits.

樹看起來像這樣:

      20
  ----------
  |        8
  |     -------
 12     |     3
-----   |   -----
A   C   E   B   D
6   6   5   1   2

所以每個字符的路徑如下(0左,1右):

So the paths to each character is as follows (0 is left, 1 is right):

  • 答:00
  • 乙:110
  • C:01
  • D:111
  • E:10

所以要計算輸出大小:

  • A:6 次出現 * 2 位 = 12 位
  • B:1 次出現 * 3 位 = 3 位
  • C:出現 6 次 * 2 位 = 12 位
  • D:出現 2 次 * 3 位 = 6 位
  • E:出現 5 次 * 2 位 = 10 位

編碼字節的總和為 12+3+12+6+10 = 43 位

Sum of encoded bytes is 12+3+12+6+10 = 43 bits

將其添加到樹中的 49 位,輸出將為 92 位或 12 字節.與存儲未編碼的原始 20 個字符所需的 20 * 8 個字節相比,您將節省 8 個字節.

Add that to the 49 bits from the tree, and the output will be 92 bits, or 12 bytes. Compare that to the 20 * 8 bytes necessary to store the original 20 characters unencoded, you'll save 8 bytes.

最終輸出,包括開始的樹,如下所示.流 (A-E) 中的每個字符都被編碼為 8 位,而 0 和 1 只是一個位.流中的空間只是將樹與編碼數據分開,不占用最終輸出中的任何空間.

The final output, including the tree to begin with, is as follows. Each character in the stream (A-E) is encoded as 8 bits, whereas 0 and 1 is just a single bit. The space in the stream is just to separate the tree from the encoded data and does not take up any space in the final output.

001A1C01E01B1D 0000000000001100101010101011111111010101010

<小時>

對于你在評論中的具體例子,AABCDEF,你會得到這個:


For the concrete example you have in the comments, AABCDEF, you will get this:

輸入:AABCDEF

頻率:

  • 答:2
  • 乙:1
  • C:1
  • D:1
  • E:1
  • F:1

樹:

        7
  -------------
  |           4
  |       ---------
  3       2       2
-----   -----   -----
A   B   C   D   E   F
2   1   1   1   1   1

路徑:

  • 答:00
  • 乙:01
  • C:100
  • D:101
  • E:110
  • F:111

樹:001A1B001C1D01E1F = 59 位
數據:000001100101110111 = 18位
總和:59 + 18 = 77 位 = 10 字節

Tree: 001A1B001C1D01E1F = 59 bits
Data: 000001100101110111 = 18 bits
Sum: 59 + 18 = 77 bits = 10 bytes

由于原來是 7 個字符的 8 位 = 56,你會因為這么小的數據塊而有太多的開銷.

Since the original was 7 characters of 8 bits = 56, you will have too much overhead of such small pieces of data.

這篇關于存儲哈夫曼樹的有效方式的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 防火门|抗爆门|超大门|医疗门|隔声门-上海加汇门业生产厂家 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 潍坊青州古城旅游景点攻略_青州酒店美食推荐-青州旅游网 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 佛山市德信昌电子有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 广东教师资格网-广东教师资格证考试网 | 陕西鹏展科技有限公司| 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 微量水分测定仪_厂家_卡尔费休微量水分测定仪-淄博库仑 | 博客-悦享汽车品质生活| 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 |