哈希表头文件(cpp文件怎么压缩)

2024-05-29 21:30:06 :26

哈希表头文件(cpp文件怎么压缩)

大家好,哈希表头文件相信很多的网友都不是很明白,包括cpp文件怎么压缩也是一样,不过没有关系,接下来就来为大家分享关于哈希表头文件和cpp文件怎么压缩的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

cpp文件怎么压缩

LZ77是一种基于字典的算法,它将长字符串(也称为短语)编码成短小的标记,用小标记代替字典中的短语,从而达到压缩的目的。也就是说,它通过用小的标记来代替数据中多次重复出现的长串方法来压缩数据。其处理的符号不一定是文本字符,可以是任意大小的符号。LZ77原理介绍LZ77是基于字节的通用压缩算法,它的原理就是将源文件中的重复字节(即在前文中出现的重复字节)使用(offset,length)的元组进行替换。通过在前文中搜索,匹配到相同字符串时,记录下到匹配位置的距离,和其匹配的长度,来代替当前字符串,可以节省很多空间。在这里插入图片描述一般情况下,匹配的字符串超过3个字符以上时才进行替换,3个一下字符有时反而会使压缩文件变大压缩压缩时以一个缓冲区,不断向右滑动的方式来扫描前文在这里插入图片描述通过缓冲区的方式,查找缓冲区已经扫描好的字符串,而向前缓冲区中的时需要向前查找匹配内容的区域,所以查找到的距离长度对都是从查找缓冲区开始匹配的,而不是从文件最开始的部分开始进行匹配。压缩开始时,有一个当前位置的指针,从当前位置与下一个位置的字符配合在查找缓冲区中查找相应字符串,如果找到匹配,则继续向下查找,直到找到最长的匹配字符串,如果没找到,则照原样输出该字符在这里插入图片描述标记长度距离对为了识别长度距离对和原字符,需要用标记来来区分,用0来标记原字符,1来标记距离长度对,所以在进行压缩时,需要打开两个文件,分别写入,一个文件写入压缩数据,一个文件写标记信息代码详解构建哈希表***隐藏网址***构建的hash表时,分为pre和head两个区域在这里插入图片描述每当有新的冲突值时,会将上一个地址存入到pre的对应地址中,每当有新冲突时就会进行一次更新。而查找时,只要找到0则代表结束。common.h此头文件,用来定义一些经常用到的常量#pragma once#pragma warning(disable:4996)typedef unsigned char UCH;typedef unsigned short USH;typedef unsigned long long ULL;const USH MIN_MAT = 3;const USH MAX_MAT = 258;const USH WSIZE = 32 * 1024;123456789101112123456789101112UCH定义为1个字节,USH定义为2个字节,ULL定义位4个字节(32位下)MIN_MAT为最小的匹配长度MAX_MAT为最大的匹配长度WSIZE为进行匹配时的窗口大小hash_table.hpp其中的插入哈希函数并解决哈希冲突void Insert(USH &matchHead, UCH ch, USH pos, USH& hashAddr){HashFunc(hashAddr, ch);matchHead = _head;_pre;_head = pos;}12345671234567先用哈希函数计算哈希地址,hashAddr为出参得到当前地址的匹配头将当前地址已有的数据放入pre中将当前字符的位置放入到head区域中LZ77.hpp此文件中封装了一个类,类中包含了压缩和解压缩方法压缩方法读取待压缩文件,打开两个文件,一个写入压缩数据,一个写入标记先在固定大小的窗口区域从前向后进行遍历,遍历的同时向哈希表中插入位置寻找最长匹配,如果找到则则写入长度,和距离,并向标记文件中写入1,如果没找到,则写入原字符,并向标记文件写入0当读取超过窗口大小时,清空窗口数据,继续向下进行合并压缩数据和标记信息,标记信息写入到压缩数据末尾,并在最后写入标记的长度,从而区分标记信息的开头位置与压缩数据的末尾位置解压方法用两个文件句柄打开压缩文件,一个句柄读取压缩数据,一个句柄读取标记信息从末尾获取标记信息的大小打开一个文件写入解压缩数据,但也打开两个文件句柄,一个以wb打开,一个以rb打开,前者用来写入解压缩的数据,后者用来向前查找匹配字符串标记信息为0时写入原子符,当读取到1时,用另一个指针向前查找

c++ map、multimap基本用法是啥,下面这个代码看不懂

map就是哈希表,用来储存成对的数据key和valmap《char,int》 m;m.insert(make_pair(’0’,10));//插入数据,make_pair这个东西就要看自己体会了,实在不知道怎么解释m.insert(make_pair(’1’,11));m.insert(make_pair(’2’,12));下面从map中读取数据,直接把key当做下标就可以得到val,只有哈希表能做这样的事情,其他如vector,list等都不行,这是哈希表最明显的特征cout《《m《《endl;输出11cout《《m《《endl;输出0map还有两个特点默认情况下插入数据的时候会自动按key排序key不能重复,重复插入无效map和multimap唯一的区别就在于2,multimap可以插入key相同的数据,用一个例子解释#include "stdafx.h"#include 《map》using namespace std;void showmap(map《int,char》 mp){printf("\n");for(map《int,char》::iterator iter=mp.begin();iter!=mp.end();++iter){printf("%d-%c\n",iter-》first,iter-》second);}printf("\n");}void showmultimap(multimap《int,char》 mmp){printf("\n");for(multimap《int,char》::iterator iter=mmp.begin();iter!=mmp.end();++iter){printf("%d-%c\n",iter-》first,iter-》second);}printf("\n");}int _tmain(int argc, _TCHAR* argv){map《int,char》 mp;mp.insert(make_pair《int,char》(0,48));mp.insert(make_pair《int,char》(1,49));mp.insert(make_pair《int,char》(2,50));mp.insert(make_pair《int,char》(3,51));mp.insert(make_pair《int,char》(1,52));showmap(mp);multimap《int,char》 mmp;mmp.insert(make_pair《int,char》(0,48));mmp.insert(make_pair《int,char》(1,49));mmp.insert(make_pair《int,char》(2,50));mmp.insert(make_pair《int,char》(3,51));mmp.insert(make_pair《int,char》(1,52));showmultimap(mmp);getchar();return 0;}运行结果:0-01-12-23-30-01-11-42-23-3对于map,key是唯一的,如果已经存在key了,再次插入想同key无效multimap的key可以有多个

c++中有没有对各种基础数据结构如二叉树,无向图,队列,栈定义的库或头文件呢

STL库中有各种常用容器,这些容器的底层实现就是这些数据结构。如vector是顺序表,queue是队列,stack是栈,set和map是红黑树,hash_map是哈希表等。其他数据结构可通过这些容器组合定义。

stl里面tree的头文件怎么用

首先,stl不代表编译器,stl指的标准模板库,每个c++编译器都会带有stl的实现你的编译器有一些别人没有的东西,那是编译器给你的福利,因为stl标准定义的东西有一些缺少(比如以前的标准中没有哈希表这类东西,但是某些编译器会提供他们的实现)你可以使用它们,这没问题。坏处是你的代码失去了可移植性。因为这些库不属于标准,在别的编译环境下是没有的,所以你的代码只能用你当前的编译器去编译,无法移植到别的编译器下。至于如何用,可以查找你编译器的文档,或者取查找它们的使用例子。STL有一定的规范,即便某些类是标准中没有的,它们提供的函数功能也一般会遵循STL规范,比如begin,end迭代器之类。如果你熟悉STL的游戏规则,你会很快发现它们的使用方式和传统的vector是一样的。

cpp文件怎么压缩的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于cpp文件怎么压缩、cpp文件怎么压缩的信息别忘了在本站进行查找哦。

哈希表头文件(cpp文件怎么压缩)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.