倒排表的压缩算法

news/2024/7/10 22:35:53 标签: es6

For压缩算法

这是倒排表的一种压缩算法。

还是那个问题,如果"小米" 这个词项,在多文档里都有,则就会导致倒排表很大,这时候就会设计到了压缩算法,这里说的是,倒排表。

那末我们来看看 for压缩算法是怎么压缩数据呢?其实你可以理解为它是将posting list(无论数字多大都是用int去存的) 转换为一个差值list   (deltas list)去存的,也就是我们之前存的不是文件id吗,这回我们去存和前一个的差值,这样是不是存的这个数就会变小,那这样我们需要的位数是不是就会变小,靠这个来压缩我们的函数

不如说上边这个 我们得到一个差值集合之后呢

发现就可以用8位去存储这些数,这样是不是跟用int去存储就变小了

但是呢,我们又发现 比如 2 这个 数字用8位去存储是不是又浪费了

我们可以在保证顺序的时候去分 在2那分成一半一半把

细心的同学又发现了,为什么不把单独的数 拎出来那么分呢?2分5字节这不还浪费吗。

但是除了要保证高效的压缩方法,还要保证快速的解码啊,我们最终还得恢复成最原来的那个倒排表。我们每块数组用了几个数组,也是要记录在磁盘上的,如果我们一个一个差这会导致这个记录又浪费了空间。这个记录呢占用1个字节

那具体这个数组拆分到什么程度,如果这个数组足够稠密的时候,就不用拆了,就是说这一块的数字特别都比较接近。这个也是动态计算出来的。

RBM压缩算法

如果数值不密集,也就是说你一个很大一个很小,这时候我们就用RBM压缩算法。

我们这时候就不用减法了,我们用除法

 

因为我们int类型是32位。我们把32位这么看,一个高16位(商),一个低16位(余数)

所以我们先把每个数除以65536也就是2^16 得到一个除数和一个余数。我们就把一个大数换成了两个小数。

那么这两个数是怎么存储起来的。其实是用Container存的

我们把那个商作为一个key 用short方法去存储

然后余数存在对应key 所对应的容器之中。

如图你就知道了

Container 包括三种container

arraycontainer  我们的上述例子就是用的这个容器

Bitmapcontainer  这个占用的空间永远位8kb

Runcontainer

这三种容器可以自己去学习


http://www.niftyadmin.cn/n/5003160.html

相关文章

【计组】2.3浮点数表示和运算

一、浮点数的表示 浮点数尾数的规格化 注:进行左规和右规仅移动数值位符号位不变 解释:尾数的最高数值位必须是一个有效位即算术意义上的1 规格化应用(与双符号位结合) 规格化浮点数的特点: 其中首位为符号位&#…

Vue + Element UI 前端篇(十二):用户管理模块

Vue Element UI 实现权限管理系统 前端篇(十二):用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…

酷雷曼第二期无人机技能培训圆满举办

第2期无人机技能培训 2023年8月24日-8月25日,第二期酷雷曼无人机技能培训及执照考试在北京圆满举办,来自五湖四海、全国各地的合作商千里相聚,培训现场热闹融洽,再续精彩盛况。 随着《无人驾驶航空器飞行管理暂行条例》正式发布…

【C语言】入门——指针

目录 ​编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 👍指针未初始化: 👍指针越界访问: 👍指针指向空间释放: 3.2如何规避野指针 …

小白学go基础06-了解切片实现原理并高效使用

slice,中文多译为切片,是Go语言在数组之上提供的一个重要的抽象数据类型。在Go语言中,对于绝大多数需要使用数组的场合,切片实现了完美替代。并且和数组相比,切片提供了更灵活、更高效的数据序列访问接口。 切片究竟是…

FOXBORO FBM232 P0926GW 自动化控制模块

Foxboro FBM232 P0926GW 是 Foxboro(福克斯博罗)自动化控制系统的一部分,通常用于监测和控制工业过程。以下是关于这种类型的自动化控制模块可能具有的一些常见功能: 数字输入通道: FBM232 P0926GW 控制模块通常具有多…

Playwright for Python:断言

一、支持的断言 Playwright支持以下几种断言: 断言描述expect(locator).to_be_checked()复选框被选中expect(locator).to_be_disabled()元素是禁用状态expect(locator).to_be_editable()元素是可编辑状态expect(locator).to_be_empty()容器是空的expect(locator).…

【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

文章目录 准备安装安装宝塔面板开启ssh和修改ssh的密码导出镜像问题解决宝塔面板无法开启防火墙无法启动ssh设置密码nginx安装失败设置开机启动相关服务准备 演示的系统环境:Ubuntu 22.04.3 LTS更新安装/升级docker到最新版本升级docker相关命令如下# 更新软件包列表并自动升级…