基于Huffman编码的GPS定位数据无损压缩算法

news2025/1/6 19:09:40

目录

一、引言

二、霍夫曼编码

三、经典Huffman编码

四、适应性Huffman编码

五、GPS定位数据压缩


提示:文末附定位数据压缩工具和源码

一、引言

        车载监控系统中,车载终端需要获取GPS信号(经度、纬 度、速度、方向等)实时上传至监控中心,监控中心按通信协议将收到的定位信息进行本地存储,便于实时监控以及历史轨迹回放。在对车队进行监控管理过程中,多辆车同时向监控中心传输GPS文件,在数据量大的情况下,对数据进行有效地压缩,降低信息冗余,降低通信费用,减少对传输信道的占用是在数据传输过程中需要解决的关键问题。

        本文针对GPS数据格式的特点,在数据预处理的基础上,提出了采用Huffman编码的方法对GPS定位数据进行压缩。该算法与目前现有的GPS定位数据压缩算法比较,程序量小,压缩比大,且易于实现。对解决车载GPS系统中数据量大而存储器资源有限的问题,以及数据传输的瓶颈问题具有重要的实际意义。

二、霍夫曼编码

        霍夫曼在1952年提出了霍夫曼编码,又称Huffman编码。这种编码因为最接近压缩比上限的编码方法,被称作最优编码。Huffman编码是无损压缩的编码,压缩后的文件重新解码后与源文件数据保持一致,这也是Huffman编码优于其他编码中最突出的地方。根据编码方式的不同,可分为经典(静态)Huffman编码和适应性(动态)Huffman编码。

三、经典Huffman编码

        经典的Huffman编码通过构造一棵用来编码和解码的Huffman树来对待处理数据进行编码。构造huffman树的首要前提是是获得每个字符的频率。然后根据字符出现的频率,构造Huffman树。首先可以将字符的频率作为节点的值。然后将所有结点排列成队列,从中选出值最小的两个结点,然后构造出一个父亲结点,使得父亲结点的值是两个孩子结点的值之和,然后将两个孩子结点出队,再将父亲结点入队,进入下一轮循环。原理图如下图所示。 

        

        由上图所示,我们获得6个字符的频次,并将它们构造成结点队列。从队列中频次最小的两个结点挑选出来,构造成一棵树。将这颗树的父亲结点入队,再从中挑选出频次最小的两个结点,依次递归,直到队列中只剩下一个根节点为止。这个时候我们就获得了Huffman编解码树。 

        获得Huffman编码树之后,我们便可以对每个字符进行重新编码,对于每个到达叶子结点所经过的路径中,如果它是一棵左子树,那么它的编码为0,如果它是一棵右子树,那么它的编码为1。我们假设编码前字符用三位二进制表示,编码后字符新的编码方式如下表所示。 

字符

频次

编码前

编码后

A

3

001

001

B

1

010

00000

C

5

011

01

D

6

100

1

E

2

101

0001

F

1

110

00001

        由上表可知,编码前该数据的比特数为(3+1+5+6+2+1)*3=54位。编码后该数据的比特位数为3*3+1*5+5*2+6*1+2*4+1*5=43位。压缩率为79.6%。随着数据量的增大,频次的逐渐提高,压缩率将进一步提升。
        但在实际生成文件过程中,由于要将Huffman编码表保存在文件的头部,增加了文件的信息冗余,实际的压缩率要比计算出的压缩率要大一些。

四、适应性Huffman编码

         由于文件头部信息等冗余信息的存在,Huffman编码的压缩仍存在可提升空间。因此减少文件头部携带的信息,可以提高编码率。要减少文件头部的信息,就需要找到一种方式,使得编码和解码按照同样的机制运行,可以获得完全相同的Huffman树,不受文件编码的影响。

        查阅论文发现,Jeffery在1987年提出了一种自适应的Huffman编码方法,可以使得编码器和解码器在传输时构造代码,动态的收集和更新字符的概率,动态的更新Huffman树。这样的好处是不需要文件头部的信息,编码器和解码器文件编解码过程中实时生成Huffman树。具体原理如下。

        首先我们对待处理的数据的字符列表的权值赋值为1,构造一棵初始的Huffman树;从文件中获得第一个字符,将字符根据当前的Huffman编码写入到文件中,通过将对应字符的权值加1,更新Huffman树。 自适应Huffman编码的原理图如下图所示。

        由上图所示,左边第一颗Huffman树是初始构造的Huffman树,所有的叶子结点权值为1;此时A的编码为00000;当从文件中获得一个新的字符时,Huffman树的权值发生更新,获得中间的二叉树,这颗二叉树已经不满足兄弟性质,因为A的叶子结点和B的叶子结点在重新排序过程中将不相邻,因此需要将该二叉树重新调整为一棵新的二叉树,即右边新得到的Huffman树,此时A的编码变为1。 

        自适应Huffman编码相比于经典的Huffman编码不需要文件头部统计各个字符的词频,只需要依据自适应策略不断的动态调整Huffman树,可以减少文件头部的信息冗余。但如果在压缩过程中或文件保存过程中出现损坏,得到的文件将无法还原为原来的数据。

五、GPS定位数据压缩

1、CSV格式的定位数据如下图

2、对定位数据预处理,缩减字符数量

3、精简后的字符串如下图,压缩率为40%左右 

4、构建自适应Haffman树进行二次压缩

通过构建自适应Haffman树进行二次压缩,压缩率可达15%左右

5、压缩结果演示

a)将源csv文件复制到该目录下
b)运行脚本文件start.bat
c)输入1并回车,执行压缩操作,生成compress.txt压缩文件

6、解压缩结果演示

a)删除源csv文件
b)运行脚本文件start.bat
c)输入2并回车,执行解压缩操作,生成decompress.csv解压缩文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧油客:从初识、再识OceanBase,到全栈上线

今天,我们邀请了智慧油客的研发总监黄普友,为我们讲述智慧油客与 OceanBase 初识、熟悉和结缘的故事。 智慧油客自2016年诞生以来,秉持新零售的思维,成功从过去二十年间以“以销售产品为中心”的传统思维模式,转向“以…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…

数据结构——有序二叉树的删除

在上一篇博客中,我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次,点赞18次,收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…

深入理解 SQL 注入:原理、攻击流程与防御措施

深入理解 SQL 注入:原理、攻击流程与防御措施 在当今数字化的时代,数据安全已成为每个企业和开发者必须面对的重要课题。SQL 注入(SQL Injection)作为一种常见的网络攻击方式,给无数企业带来了巨大的损失。本文将深入…

android WebRtc 无法推流以及拉流有视频无声音问题

最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没…

微信小程序之手机归属地查询

微信小程序之手机归属地查询 需求描述 API申请和小程序设置 API申请 第一步:完整账号注册 我们需要来到如下网站,注册账号:万维易源 第二步:账号注册完成以后,点击右上角的控制台信息。 第三步:在控制…

【机器学习】机器学习的基本分类-监督学习-Lasso 回归(Least Absolute Shrinkage and Selection Operator)

Lasso 回归是一种线性回归方法,通过引入 ​ 正则化(绝对值惩罚项)约束回归系数,既能解决多重共线性问题,又具有特征选择能力。 1. Lasso 回归的目标函数 Lasso 的目标是最小化以下损失函数: 其中&#xff…

优化LabVIEW数据运算效率的方法

在LabVIEW中进行大量数据运算时,提升计算效率并减少时间占用是开发过程中常遇到的挑战。为此,可以从多个角度着手优化,包括合理选择数据结构与算法、并行处理、多线程技术、硬件加速、内存管理和界面优化等。通过采用这些策略,可以…

python学opencv|读取图像(四)imshow()函数尝试

【1】引言 前述已经学习了opencv读取图像的基本操作,包括下述链接: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 python学opencv|读取图像(三)放大和缩小图像…

MongoDB分片集群搭建及扩容

分片集群搭建及扩容 整体架构 环境准备 3台Linux虚拟机,准备MongoDB环境,配置环境变量。一定要版本一致(重点),当前使用 version4.4.9 配置域名解析 在3台虚拟机上执行以下命令,注意替换实际 IP 地址 e…

MATLAB 最小二乘平面拟合(90)

MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…

AI+电影特效产品化:开启电影人物年轻化新时代

随着人工智能技术的不断进步,它正在改变着我们生活的方方面面,包括娱乐产业。在电影制作领域,AI技术的应用尤其引人注目,尤其是在实现演员年轻化或老化效果方面。本文将介绍一款名为MyTimeMach

Appium 安装问题汇总

好生气好生气,装了几天了, opencv4nodejs 和 mjpeg-consumer 就是装不了,气死我了不管了,等后面会装的时候再来完善,气死了气死了。 目录 前言 1、apkanalyzer.bat 2、opencv4nodejs 3、ffmpeg 4、mjpeg-consume…

Cannot resolve symbol ‘ActivityThread‘ | Android 语法

背景 ActivityThread 是 Android 系统内部使用的一个类,它位于 android.app 包中,但在 Android SDK 的公共 API 中并没有公开。 由于 ActivityThread 是隐藏的内部类,因此在编写单元测试或功能开发时,无法直接引用它。可以使用反射来访问内部 API,或者使用依赖注入的方式…

探索自然语言处理奥秘(NLP)

摘要 自然语言处理(NLP)是人工智能领域的一个重要分支,它致力于使计算机能够理解、解释和生成人类语言。这项技术让机器能够阅读文本、听懂语音,并与人类进行基本的对话交流。 通俗理解 自然语言处理(NLP&#xff09…

JAVAWeb中的Servlet学习

一 Servlet简介 1.1动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源.例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成,例如Servle…

「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局

本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。 关键词 UI互动应用照片墙布局Grid 布局动态图片加载用户交互 一、功能说明 照片墙布局应用的特点: 动态加载多张图片组成网格布…

dhcpd服务器的配置与管理(超详细!!!)

前提条件: (1)虚拟机能够联网(如果nat模式不能联网的看另一期) CentOS7 NAT模式不能联网-CSDN博客 (2)系统是Centos8,因为下载的dhcp-server软件包版本和Centos7不匹配,如果你能成…

java基础概念47-ArrayList、LinkList和迭代器

一、ArrayList集合 1-1、ArrayList的两种添加信息的方式 1-2、ArrayList集合底层逻辑 1、利用空参创建的集合,在底层创建一个默认长度为0的数组 2、添加第一个元素时,底层会创建一个新的长度为10的数组 3、存满时,会扩容1.5倍。 4、如果…

oracle之用户的相关操作

(1)创建用户(sys用户下操作) 简单创建用户如下: CREATE USER username IDENTIFIED BY password; 如果需要自定义更多的信息,如用户使用的表空间等,可以使用如下: CREATE USER mall IDENTIFIED BY 12345…