当前位置: 首页 > news >正文

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

目录

一、引言

二、霍夫曼编码

三、经典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解压缩文件

相关文章:

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

目录 一、引言 二、霍夫曼编码 三、经典Huffman编码 四、适应性Huffman编码 五、GPS定位数据压缩 提示:文末附定位数据压缩工具和源码 一、引言 车载监控系统中,车载终端需要获取GPS信号(经度、纬 度、速度、方向等)实时上传…...

php:完整部署Grid++Report到php项目,并实现模板打印

一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…...

C标签和 EL表达式的在前端界面的应用

目录 前言 常用的c标签有: for循环 1 表示 普通的for循环的 2 常在集合中使用 表示 选择关系 1 简单的表示如果 2 表示如果。。否则。。 EL表达式 格式 : ${属性名/对象/ 集合} 前言 本篇博客介绍 c标签和el表达式的使用 使用C标签 要引入 …...

Linux絮絮叨(四) 系统目录结构

Linux 系统的目录结构(Filesystem Hierarchy Standard, FHS)定义了 Linux 系统中文件系统的标准布局,以下是一些常见目录的功能: 根目录 / 描述:所有文件和目录的起始点,Linux 文件系统的根。内容&#xf…...

Java基于SpringBoot的网上订餐系统,附源码

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

《Java核心技术I》死锁

死锁 账户1:200元账户2: 300元线程1:从账号1转300到账户2线程2:从账户2转400到账户1 如上,线程1和线程2显然都被阻塞,两个账户的余额都不足以转账,两个线程都无法执行下去。 有可能会因为每一个线程要等…...

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…...

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备:将其他信号转换为计算机可以识别的信号(电信号)。输出设备:将电信号(0、1)转为人或其他设备能理解的…...

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器(HMD)是进入虚拟现实环境的一把钥匙,拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域,正如如今的互联网一样,虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...

ssm 多数据源 注解版本

application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…...

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…...

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…...

刷题重开:找出字符串中第一个匹配项的下标——解题思路记录

问题描述&#xff1a; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&…...

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…...

人工智能机器学习无监督学习概念及应用详解

无监督学习&#xff1a;深入解析 引言 在人工智能和机器学习的领域中&#xff0c;无监督学习&#xff08;Unsupervised Learning&#xff09;是一种重要的学习范式。与监督学习不同&#xff0c;无监督学习不依赖于标签数据&#xff0c;而是通过模型从无标签的数据中学习数据的…...

APM装机教程(五):测绘无人船

文章目录 前言一、元生惯导RTK使用二、元厚HXF260测深仪使用三、云卓H2pro遥控器四、海康威视摄像头 前言 船体&#xff1a;超维USV-M1000 飞控&#xff1a;pix6c mini 测深仪&#xff1a;元厚HXF160 RTK&#xff1a;元生惯导RTK 遥控器&#xff1a;云卓H12pro 摄像头&#xf…...

微信小程序 运行出错 弹出提示框(获取token失败,请重试 或者 请求失败)

原因是&#xff1a;需要登陆微信公众平台在开发管理 中设置 相应的 服务器域名 中的 request合法域名 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: true, // 默认为网格布局page: 0, // 当前页码size: 10, // 每页大小hasMore…...

IDEA的service窗口中启动类是灰色且容易消失

大家在学习Spring Cloud的过程中,随着项目的深入,会分出很多个微服务,当我们的服务数量大于等于三个的时候,IDEA会给我们的服务整理起来,类似于这样 但是当我们的微服务数量达到5个以上的时候,再启动服务的时候,服务的启动类就会变成灰色,而且还容易丢失 解决方法 我们按住…...

R中利用ggplot2绘制气泡图

闲来无事&#xff0c;整理了一下自己的绘图笔记&#xff0c;顺便分享到CSDN上。 一、介绍 气泡图&#xff08;Bubble Plot&#xff09;是一种常用的数据可视化方法&#xff0c;用于展示三个变量之间的关系。气泡图的特点是通过气泡的大小、颜色和位置来表达数据中的多维信息。…...

CID引流电商

ClickID技术是基于多家媒体平台开发的电商引流服务&#xff0c;通过媒体提供的宏参数&#xff0c;间接解决电商平台订单数据的回传问题&#xff0c;帮助账户收集到极致精准的数据模型&#xff0c;搭建不同媒体往各平台引流的桥梁。简单来说就是通过ClickID数据监测到另外一个平…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用

Linux 内存管理调试分析&#xff1a;ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础&#xff0c;但这一子系统结构复杂&#xff0c;常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题&#xff0c;需要一套工具化、…...

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…...