lzma算法分析

2023-11-06

lzma算法分析
这几天在公司主要在做压缩相关,记录一下所得。
目前业界主流的压缩算法感觉并不多,好用的就Huffman,lz系列,其他的像差分编码,vlq编码,感觉只能做个数据预处理,或者一种小范围的压缩。
lz系列有很多,主要有lz77 lz78 lzma,基本思想是一样的,都是一种字典编码,如,我有一段文本,里面有“abcdefgabcde”,那么后面的abcde并没有必要,可以用前面的替代,所以,其实可存储为“abcdefg65”,6代表offset,5代表length,既用距离当前位置6字节,长度为5的字节串表示当前字节串,由此就减少了三个字节,当然,这里要求0和5也要是u8类型,或者更小。
lz系列核心算法其实很简单,就是这样,但却是业界压缩效果最好的算法,大道至简啊。
lzma就是这么做的,在这里,思考这么几个问题:
1:当压缩算法扫描到中间某段位置时,如何和前面的内容进行快速比较。
2:如何区分当前是压缩的内容,还是未压缩的内容。
首先回答第一个问题,很简单,用哈希,笔者采用了FNV哈希算法,效果挺好的,用c++stl中的hash不知道效果如何,不过其实后来发现,哈希冲突在这里并不严重,一个好的哈希只能带来速度和内存的提升了,没办法提升压缩率的。然后我们如何解决哈希冲突呢,hash冲突这里其实是重点,所表达的就是可能出现了相同字节串。
我们先说这个算法如何工作,首先我们只对定长的几个字节算hash值,例如我们只算5个字节的hash值,然后保存hash,之后每扫描一个字节,取出当前位置往后5个字节,算hash,和前面的比较,如果hash值相同,则在进一步比较每个字节内容,hash可以很快的知道内容是不一样的,没有办法知道内容是一样的,所以我们还需要实际的去比较每个字节,这意味着,我们在保存hash的时候,还需要保存算得这个hash的字节在整个文件中的index,我们取出上一个相同hash值的字节的起始index,和当前位置往后比,一直比到文件结束或着出现不同,这里是一个重点,如:abcdefgabcabcabcabc,想象一下,这里如何压缩呢,好的做法是:abcdefg3339,第一组33代表offet是3,长度是3,第二个39offet是3(就是第一个03),长度是9,所以,相同字节串可以涵盖本身(39包含了自己)。
回到前面,我们应该如何设计保存hash的结构了,首先为了快速索引,应该用一个数组或者vector保存hash,既hash值作为下标,这样可以快速索引,如何解决hash冲突呢,easy,不解决,只保存,如我们构造一个长度为1000的数组,把数组分成100块,每块有10个元素,产生的hash值在0-99中间,现在算的hash值为1,那么在第一块的第一个位置填入此时的index,往后又算出hash值1时,则在第1块的第二个位置填入,所以,这里的块数作为hash索引, 一块里面有多少个则代表可填入相同hash值的数量,所以如果数量很多,那么就覆盖前面的,这里可以用一个环形缓冲区实现。
回答第二个问题,如何分别是原来未压缩的数据,还是保存的offset和length呢,用VLQ编码,此处请goolge vlq编码,此外在实际验证中发现,offset 和length采用vlq编码后,往往length比较小,采用vlq至少需要一个字节,所以可以考虑将length编入offset中,既offset低位保存length,再节省空间。

————————————————
版权声明:本文为CSDN博主「push_rbp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_52329237/article/details/109555089

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lzma算法分析 的相关文章

  • 哈夫曼编码

    哈夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 哈夫曼编码是可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字 有时称之为最佳编码
  • 12 shell命令之打包

    昨晚写的awk 说实话 对我而言 那是一个最复杂的命令 写得不是很好 可能在结构组织上面有很大的问题 后续有心得会再调整修改 本文将介绍linux的一组打包命令 这其中有我们最常用的tar 也有我们几乎没有见过的mksquansh 接下来就
  • tar压缩和解压文件或文件夹

    1 使用tar压缩文件 tar zcvf test tar gz test 该命令表示压缩当前文件夹下的文件夹test 压缩后缀名为test tar gz 如果不需要压缩成gz 只需要后缀为tar格式的 那么输入如下命令 tar cvf t
  • Linux必杀(十六):打包命令tar

    题记 tar 的参数非常多 挑重点的讲几个 tar j z cv f 新建的文件名 filename lt 打包与压缩 tar j z tv f 新建的文件名 lt 查看文件名 tar j z xv f 新建的文件名 c目录 lt 解压缩
  • 推荐三款最好用的压缩/解压软件

    写在前面 推荐三款特别好用的压缩 解压软件 Bandizip WinRAR 7 Zip 这三款软件也分别代表了三种常用的压缩格式 zip rar 7z 压缩格式 格式 优点 速度 zip 兼容性好 快 rar 私有格式 中 7z 压缩率高
  • Linux下tar命令解压到指定的目录

    文章转自 http blog sina com cn s blog 62449fcf0100nfar html 版权归原作者 Linux下tar命令解压到指定的目录 tar zxvf bbs tar zip C zzz bbs 把根目录下的
  • word文档截图拷贝大小优化

    平时写教程到word文档会需要图文并茂的方式 所以会截很多图片 但是截取的图片都是png格式的 所以会造成word文档可能截几张图片就很大了 所以如何把截的图片以jpg形式拷贝进word呢 方法就是写一个程序把屏幕截图保存为jpg 然后再把
  • Linux 压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    Linux 压缩 解压文件的 4 种方式 tar gzip gunzip zip unzip 7z命令使用方法 文章目录 Linux 压缩 解压文件的 4 种方式 tar gzip gunzip zip unzip 7z命令使用方法 1 t
  • 哈夫曼树实现文件的压缩与解压缩

    利用哈夫曼树实现文件的压缩与解压缩 压缩 1 统计出文件中相同字符出现的次数 2 获取哈夫曼编码 次数作为权值构建哈夫曼树 3 重新编码 写回压缩文件 保存头文件 源文件后缀 编码信息的行数 每个字符的权 保存编码 解压缩 1 获取原文件后
  • Java 解压压缩文件,springMVC 接收压缩文件

    解压 zip rar 类型的压缩文件 1 首先需要 jar 包 ant 1 6 5 jar 解压zip格式的压缩文件 junrar 0 7 jar 解压rar 格式 如果是 maven
  • Android 加载高清巨图,无需剪裁压缩

    LargeImage Android 加载大图 可以高清显示10000 10000像素的图片 可以滑动 放大缩小具有PhotoView的效果 普通图片也可以用它展示 Gradle compile com shizhefei LargeIma
  • lzma算法分析

    lzma算法分析 这几天在公司主要在做压缩相关 记录一下所得 目前业界主流的压缩算法感觉并不多 好用的就Huffman lz系列 其他的像差分编码 vlq编码 感觉只能做个数据预处理 或者一种小范围的压缩 lz系列有很多 主要有lz77 l
  • Java图片压缩thumbnailator

    1 依赖 需要thumbnailator包
  • 在webpack中使用monaco-editor

    目录 前言 使用 自己总结的使用过程 1 安装 2 在页面中使用 3 开启辅助功能 4 如何设置菜单中文显示效果 5 编辑器功能 6 monaco editor使用到的JS文件如何压缩 2020年4月28日11 49 58 前言 我查过网上
  • JAVA图片压缩

    图片压缩代码操作 需要压缩的原图片路径为 src 压缩后存放的路径为 dist 需要压缩的宽度为 width 需要压缩的后的高度为 height File srcfile new File src 原图片是否存在 if srcfile ex
  • 几种存segmentation mask方法对比

    发现同一幅图的原图 jpg 1920 1080 1920 times 1080 1920 1080 才 155K 其用 npy 存的 segmentation mask 居然有 2M 按理 segmentation mask 只有一个通道
  • Qt实现图片的简单压缩

    在编程过程中 涉及到网络传输或资源加载时 过大的图片往往是编程人员的噩梦 加载时间过长 体验效果差 特别在即时通讯的发送图片时 大图往往半天加载不出来 于是 先对图片进行压缩 暂时显示模糊图片 然后下载大图最后更新下载的大图 这一过程成为解
  • tw8836flash制作

    TW8836 Flash的bin制作 2 选bitmap 在选menu 3 4 压缩需勾选 5 添加图片 制作bin文件 6 改生成的MRLE为Bin后缀 BIN文件为烧写 INF文件为图片存储信息 代码要用到 7 这里用到BIN文件作为烧
  • c# Byte解压,压缩

    using ICSharpCode SharpZipLib GZip using System using System Collections Generic using System IO using System Linq using
  • Ubunt文件压缩和解压、打包和解包

    Ubunt文件压缩和解压 打包和解包 一 压缩和解压 zip tar gz tar bz2 1 zip 优点 支持不同的操作系统平台 如Linux Windows Mac OS 缺点 支持的压缩率不是很高 压缩 zip r file nam

随机推荐

  • Linux下WiFi驱动开发——WiFi基础知识解析(转)

    详见 https blog csdn net zqixiao 09 article details 51103615
  • SQL Server 命令行管理工具:SqlLocalDB.exe

    SqlLocalDB exe 是一个简单的工具 它使用户能够从命令行轻松管理 LocalDB 实例 它作为 LocalDB 实例 API 的简单包装实现 与在很多类似的 SQL Server 工具 例如 SQLCMD 中一样 参数作为命令行
  • flask框架实现文件下载功能

    传入文件名即可下载文件 from flask import Flask send file Response send from directory app Flask name app route download def downloa
  • Python编程题

    把数组 0 1 1 0 1 1 0 1 1 1 0 0 中所有的1排到左侧 0排到右侧 方法1 思路 1 首先进行可以保证0在左侧 1在右侧 2 新建一个空列表 3 把原列表中的值从最后1个复制给新建列表 直到第一个元素被复制完 list1
  • Qt 画图,void A::paintEvent(QPaintEvent *event){..}这函数怎么调用它?

    不用调用 需要用这个函数的时候调用A gt update 就可以得到调用这个函数的目的
  • shell中单引号、双引号、反引号的用法及区别

    单引号 这个比较暴力 不管单引号里面有什么都原样输出 无视一切变量 所见即所得 如果要用来做字符比较和输出 注意不能输出变量 也不认识通配符 命令等 even ubuntu echo a PATH aa a PATH aa 双引号 双引号感
  • Leetcode刷题总结-3.二叉树篇

    Leetcode刷题总结 二叉树刷题心得 总结 文章目录 Leetcode刷题总结 前言 一 二叉树刷题思路 二 美团面试题 2 1 第十套卷面试题 2 2 第九套卷面试题 三 华为研发工程师编程题 四 华为2016研发工程师编程题 前言
  • 【华为OD机试真题2023B卷 JAVA&JS】太阳能板最大面积

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 太阳能板最大面积 知识点分治 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 给航天器一侧加装长方形或正方形的太阳能板 图中的红色斜线区域 需要先安装两个支柱 图中的黑色
  • 【项目总结】基于SpringBoot+Ansj分词+正倒排索引的Java文档搜索引擎项目总结

    文章目录 项目介绍 开发背景 主要用到的技术点 前端 后端 Ansj分词 实现索引模块 实现Parser类 实现Index类 完善Parser类 优化制作索引速度 实现搜索模块 实现DocSearcher类 处理暂停词 项目编写过程中遇到的
  • Hadoop系统入门之Join在MapReduce中的实现

    MapReduce Interview 描述如何使用MapReduce来实现join的功能 考察点 1 MapReduce执行流程 2 JOIN的底层执行过程 3 JOIN的多种实现方式 ReduceJoin shuffle MapJoin
  • 怎样将计算机32位换为62位,电脑32位怎么换62位

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 电脑32位换62位的方法如下 1 备份原来的操作系统中的文件 特别注意收藏夹 我的文档 以及桌面等位置的文件 2 准备好64位操作系统的安装光盘或者ISO映像 制作操作系统
  • 关于Boolean==Boolean和Boolean=Boolean的启示

    昨晚做java面试题 一道原题是这样的 来自 JAVA最最最 基本的面试题 慕课手记 http www imooc com article 13754 6 给出以下代码 请问该程序的运行结果是什么 class Example public
  • C++中将csv文件中的数据存储到数组中

    ifstream fin filename c str 以输入方式打开文件存到缓冲空间fin中 string line int i 0 int comma 0 while getline fin line 读取fin中的整行字符存在line
  • 责任链中的嵌套使用

    1 按照之前的业务 用户建档后 挂号 生成挂号费用 根据挂号费 根据用户的身份生成不同的金额 儿童或者特殊人群挂号免费 2 具体实现 我们需要增加几个符合过滤器 public class CompositeFreeFilter extend
  • Winform ListView控件用法

    用法一 1直接从工具箱里把ListView拖到控件上 2可在窗体的Load 事件里 写如下代码 设置一些常用属性 listView1 View View Details listView1 LabelEdit true listView1
  • javascript全量匹配屏蔽词

  • iptables官方手册整理

    iptables官方手册整理 目录 1 简介 2 首先 什么是包过滤 3 快速入门指南 4 数据包过滤流程 5 具体如何使用Iptables命令实现过滤功能 6 地址转换 NAT 7 排除建议 1 简介 读者们 大家好 在这里我们假设你已经
  • 安装golang项目的 GVM

    GITHUB地址 https github com moovweb gvm bash lt lt curl s S L https raw githubusercontent com moovweb gvm master binscript
  • keras fine-tune方法

    https blog csdn net jdzwanghao article details 80697104
  • lzma算法分析

    lzma算法分析 这几天在公司主要在做压缩相关 记录一下所得 目前业界主流的压缩算法感觉并不多 好用的就Huffman lz系列 其他的像差分编码 vlq编码 感觉只能做个数据预处理 或者一种小范围的压缩 lz系列有很多 主要有lz77 l