标签: huffman-code

3
推荐指数
1
解决办法
3943
查看次数

霍夫曼编码 - 标头和 EOF

我目前正在致力于在 Java 中实现基于霍夫曼算法的程序,并且我正处于需要将编码内容输出到文件的阶段。我对如何实现解码所需的标头和 eof 有点困惑。对于目前的标题,我拥有输入文件中出现的所有唯一值及其频率,但在一些文章中,我看到人们用 0 或 1 表示节点,然后是频率(我有点困惑) by 因为它没有说明符号是什么)。

另外,对于我所理解的 EOF,我像符号一样对其进行编码,以便读取和解码,但是我不确定我可以使用什么值来肯定不会出现?我知道它的权重需要为 1,但不确定如何确保它实际上不在文件中。

algorithm encoding header huffman-code eof

3
推荐指数
1
解决办法
1万
查看次数

Matlab,图像压缩

我不确定这要求我在matlab做什么?编码意味着什么?答案应该是什么格式?谁能帮我解决一下呢?编码8x8图像补丁并打印出结果

我有一个8X8的图像

symbols=[0 20 50 99];
p=[32 8 16 8];
p = p/sum(p);
[dict, avglen] = huffmandict(symbols, p);
A = ...
[99 99 99 99 99 99 99 99 ...
20 20 20 20 20 20 20 20 ...
0 0 0 0 0 0 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 …
Run Code Online (Sandbox Code Playgroud)

matlab huffman-code

3
推荐指数
1
解决办法
8169
查看次数

Jpeg哈夫曼编码过程

JPEG 标准中的霍夫曼表是通过两个步骤从统计数据集合中生成的。步骤之一是实现该图给出的功能/方法:(该图在 JPEG 标准的附件 K 中给出): 功能

问题就在这里。之前在标准(附录C)中说了这样一句话:

霍夫曼表以 16 字节列表 (BITS) 的形式指定,给出从 1 到 16 的每个代码长度的代码数量。后面是 8 位符号值 (HUFFVAL) 列表,每个符号值是分配一个霍夫曼代码。

显然BITS是 16 个元素的列表。但在上图中,i首先设置为 32( i=32) 然后我们要访问BITS[i]. 可能是我理解错了,所以请有人给我答案。

以下是 JPEG 标准对图片的描述: 图 K.3给出了调整 BITS 列表的过程,以便没有代码长于 16 位。由于符号是针对最长的霍夫曼码配对的,因此每次从该长度类别中删除两个符号。该对的前缀(短一位)被分配给该对中的一个;然后(跳过该前缀长度的 BITS 条目)来自下一个最短非零 BITS 条目的码字被转换为长一位的两个码字的前缀。在 BITS 列表减少到最大代码长度 16 位之后,最后一步从代码长度计数中删除保留的代码点。

这是上图的代码:

void adjustBitLengthTo16Bits(vector<char>&BITS){
    int i=32,j=0;
    while(1){
        if(BITS[i]>0){
            j=i-1;
            j--;
            while(BITS[j]<=0)
                j--;
            BITS[i]=BITS[i]-2;
            BITS[i-1]=BITS[i-1]+1;
            BITS[j+1]=BITS[j+1]+2;
            BITS[j]=BITS[j]-1;
            continue;
        }
        else{
            i--;
            if(i!=16)
                continue;

            while(BITS[i]==0)
                i--;
            BITS[i]--;
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

encoding jpeg huffman-code

3
推荐指数
1
解决办法
3685
查看次数

具有相同权重树的霍夫曼编码中的合并顺序

我真的很为合并在霍夫曼编码中具有相同“权重”的树的顺序而苦苦挣扎。我查看了很多来源,但它们似乎都只涵盖“简单情况”,其中不超过两个具有相同权重的元素,或者根本没有涵盖整个主题。



假设我有以下要编码的字符串:ABCDEE. (风格基于本网站
所以我有:

    FREQUENCY       VALUE
    ---------       -----
         1            A
         1            B
         1            C
         1            D
         2            E
Run Code Online (Sandbox Code Playgroud)

我现在开始用两个最小的元素构建树:
问题 1)我是否必须使用A & B或如何决定我应该使用哪些值?我知道它们必须是最小的,但除此之外呢?例如A & D
这是重要末(可以说,我做到以下几点:

  2:[A&B]       2:[B&C]
    /  \          /  \
  1:A   1:B     1:B   1:C
Run Code Online (Sandbox Code Playgroud)

以及下表:

    FREQUENCY       VALUE
    ---------       -----
         2          [A&B]
         2          [C&D]
         2            E
Run Code Online (Sandbox Code Playgroud)

问题 2)再次...我应该以什么顺序合并树?例如[A&B]&E[A&B]&[C&D]
因为,如果我[A&B]&E先合并,树将如下所示:

      4:[A&B&E]
        /   \
    2:[A&B]   2:E
    /   \
  1:A   1:B
Run Code Online (Sandbox Code Playgroud)

问题3)如何决定2:E …

compression algorithm tree encoding huffman-code

3
推荐指数
1
解决办法
4350
查看次数

霍夫曼将两个字符编码为一个

我需要霍夫曼代码(最好是在python或java中),它可以编码文本而不是一个字符(a = 10, b = 11),而是两个(ab = 11, ag = 10).是否可能,如果可以,我在哪里可以找到它,也许它在互联网的某个地方,我就能找到它?

python java huffman-code

2
推荐指数
1
解决办法
1007
查看次数

像霍夫曼编码这样的算法是否实际用于生产?

目前,我正在开发一款需要在iPad上存储大量文本的应用.我的问题是,像生产中实际使用的霍夫曼编码这样的算法吗?我只需要一个非常简单的压缩算法(不会有大量的文本,它只需要一个更有效的存储方法),那么像Huffamn这样的工作呢?我应该调查一些其他类型的压缩库吗?

theory compression algorithm huffman-code ios

2
推荐指数
1
解决办法
1359
查看次数

首次执行后CPU的霍夫曼压缩速度更快?

我最近在C++中构建了一个Huffman编码的CPU实现.我还在CUDA中构建了一个GPU版本以便比较时间,但是在测试CPU的时间时我遇到了一个问题:

当通过压缩大文件进行压力测试时,例如几乎每个字母中的每个字母和其他各种ascii字符的97mb文本文件,我的CPU实现在第一次执行时将花费大约8.3秒.之后,时间显着下降到1.7秒.注意:我只计算CPU计算频率的时间,而不是字符串的编码和写入文件.

任何想法如何可能?我正在关闭所有文件指针,据我所知,不应该缓存任何内容.

如果需要任何源代码,请告诉我,谢谢.

c++ compression huffman-code

2
推荐指数
1
解决办法
637
查看次数

函数不会接受auto_ptr的迭代器

我写了一些我试图修复的有缺陷的Huff压缩代码.我做的第一件事就是将指针切换到auto_ptr(有理由我没有使用另一个智能指针).我创建了一个向量,auto_ptr但是当我尝试将auto_ptr传递给函数时,*(vector.begin())它不起作用.

我的功能代码我试图将所有权传递给(它是一个成员函数为set_node):

struct Node {
    int weight;
    char litteral;
    auto_ptr<Node> childL;
    auto_ptr<Node> childR;
    void set_node(int w, char l, auto_ptr<Node>& L(), auto_ptr<Node>& R()){
        weight = w;
        litteral = l;
        childL = L;
        childR = R;
    }
};
Run Code Online (Sandbox Code Playgroud)

这就是我尝试调用它的方式(p是节点):

p.set_node(w, '*', *nodes->begin(), *(nodes->begin()+1));
Run Code Online (Sandbox Code Playgroud)

这是向量声明的方式:

vector<auto_ptr<Node> >* nodes = new vector<auto_ptr<Node> >;
Run Code Online (Sandbox Code Playgroud)

c++ auto-ptr standard-library huffman-code

2
推荐指数
1
解决办法
217
查看次数

计算二叉树节点计数

有可能计算出有多少节点有任意二叉树吗?叶子数和每片叶子的深度是已知的(实际上是霍夫曼树).

我需要它,以便能够在实际构建树之前为树分配所需的内存,并避免以后重新分配内存.

language-agnostic algorithm binary-tree huffman-code

2
推荐指数
1
解决办法
78
查看次数