c++高效的LZ编码以及LZ译码类(编码时引用了哈夫曼树统计概率,可另外补充)

这篇博客介绍了如何利用C++实现LZ编码和解码过程,特别是在编码阶段结合了哈夫曼树进行概率统计,以提高压缩效率。文章适合对数据压缩和C++编程感兴趣的读者。
摘要由CSDN通过智能技术生成

//输出序列使用的是字符串

//仅供参考

//LZ编码结点
class LZP;
//LZ编码器//对霍夫曼编码具有依赖性
class LZCODE;
//LZ译码器
class LZDECODE;

class LZP {//加一个前置索引则可以将译码器优化
public:
    int num;//信源符号
    int lastposit;//前一个位置
    int posit;//当前位置
    int pnum;//尾巴个数
    LZP** p;//尾巴指针

    LZP() :num(0), posit(0), pnum(0), p(NULL), lastposit(0) {};
    ~LZP() {
        for (; pnum > 0; pnum--)
        {
            if (p[pnum - 1])
                delete p[pnum - 1];
        }
        if(p)
            free(p);
    }
};

class LZCODE
{
    LZP* root;//lz编码表表根
    int* list;//符号编码表,坐标表示当前编号
    int xnum;//信源符号个数
    int** file;//被发送的信息,坐标表示当前段号,0表示前一段号,1表示末尾字符编号//处理后发送
    int ynum;//段数

    //查找是否有这样的信源符号串//信源符号数组,数组长度
    LZP* findp1(int* numlist,int length) {

        if (numlist == NULL)
            return NULL;
        if (length < 1 )
            return NULL;
        LZP* q = root;
        for (int i = 0; i < length;i++)
        {
            q=findp2(q, numlist[i]);
            if (q == NULL)
                return NULL;
        }
        return q;
    }

    //查找某LZ结点后方是否存在某信源符号,并返回该符号所在指针//某节点地址,某信源符号

    LZP* findp2(LZP* last,int num) {
        int i = 0;
        for (i = 0; i < last->pnum; i++)
        {
            if (last->p[i])
                if (last->p[i]->num == num)
                    return last->p[i];
        }
        return NULL;
    }

    //在某节点后增加一个符号为num,上一位置为lastposit,当前位置为posit的节点
    void newp(LZP *p,int num,int lastposit,int posit) {
        p->pnum++;
        p->p = (LZP**)realloc(p->p, p->pnum * sizeof(LZP*));
        p->p[p->p
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值