稀疏数据压缩查询方法:Rank & Select 操作

简介: 1.稀疏数据的例子   对于网络图对应的节点关联矩阵、数据生成的哈希表等,这些存储起来是稀疏的,这样我们就会想到需要压缩空间。但是在压缩存储空间的同时,还要支持高效的查询操作。   Rank & Select 就可以对稀疏的数据进行压缩,还能支持高效的查询操作。

1.稀疏数据的例子

  对于网络图对应的节点关联矩阵、数据生成的哈希表,这些存储起来是稀疏的,这样我们就会想到需要压缩空间。但是在压缩存储空间的同时,还要支持高效的查询操作。

  Rank & Select 就可以对稀疏的数据进行压缩,还能支持高效的查询操作。

2.Rank & Select 操作压缩稀疏数据原理

  以下图为例子,假如是经过哈希后得到的哈希数组:

  

  构造数组A和B:

    Vec-A:1010100110001    (每个位置一个比特位,1:有数据,0:无数据)

     Num-B:12  2  23  11  12  1  (数据按原来的相对顺序,保存为一个数组)

  (1)Rank:

    针对Vec-A数组而言,记录每个位置前面(包括本位)有多少个1,也就是对应之前有多少个有效数字。这样做的目的是使得,数组中的有效数字的排名与在Num-B中的位置一致。

  (2)Select:

    根据查询数据在Vec-A上面的Rank排名,在Num-B中查询数据。

  (3)Rank & Select

    

    eg1:位置4对应的位置没有数据,所以在Vec-A中标记为0;

    eg2:位置5对应的位置有数据23,所以在Vec-A中标记为1。Vec-A(5)对应的rank为3,说明包含自己在内之前一共有3个数据,且在位置5对应的数据保存在Num-B的第3为,即Select(5)=Num-B(Rank(5))

4.使用SSE指令高效计算Rank

  SIMD,单指令多数据,就是一条指令由多个执行单元同时并行执行操作多个数据

  SSE是指令集的简称,它包括70条指令,其中包含SIMD浮点计算、以及额外的SIMD整数和高速缓存控制指令。就是说SSE中存在指令,是SIMD指令,使得多核CPU可以高效执行。

  SSE指令 int _mm_popcnt_u32 (unsigned int a); 返回32为无符号整形 a 中bit位为1的位的个数。

5.Rank & Select 简单示例

  实例程序就是上面图中的例子,13个位置(1,2,3,..,14),6个有效位置。对其进行使用rank & select,进行压缩、并支持查询。

  例子较小,没有使用SSE指令,只是对rank select操作的简单说明。

 1 #include <iostream>
 2 #include <string.h>
 3 #include <bitset>
 4 using namespace std;
 5 
 6 /**
 7 设置原始数组num以及设置对应在ver_A的比特位
 8 num:保存原始数据的数组
 9 n:数组大小
10 ver_A:标记有效数字位向量
11 */
12 int initNumVer(int *num,int *ver_A,int n){
13     memset(num,0,sizeof(int)*n);
14     num[1] = 12;    *ver_A |= (1<<1);
15     num[3] = 2;     *ver_A |= (1<<3);
16     num[5] = 23;    *ver_A |= (1<<5);
17     num[8] = 11;    *ver_A |= (1<<8);
18     num[9] = 12;    *ver_A |= (1<<9);
19     num[13] = 1;    *ver_A |= (1<<13);
20     return 0;
21 }
22 
23 /**
24 ver_A:位向量
25 rank:排名
26 num_B:压缩后的数组
27 pos:要查的位置
28 */
29 int query(int *ver_A,int *rank,int *num_B,int pos){
30     if((*ver_A&(1<<pos)) == 0)
31         return 0;
32     else
33         return num_B[rank[pos]];
34 }
35 
36 int main (){
37     const int n = 14;
38     int  ver_A = 0;
39     int *num = new int[n];
40     int *rank = new int[n];
41     int *num_B = new int[7];    ///例子中有效数字6个,num_B[0]不使用
42 
43     ///设置原始数组num以及设置对应在ver_A的比特位
44     initNumVer(num,&ver_A,14);
45 
46     ///设置rank与压缩后的数组num_B
47     for(int i=0,j=0;i<n;i++){
48         if( (ver_A&(1<<i)) != 0)
49             num_B[++j] = num[i];
50         rank[i]=j;
51     }
52 
53     ///查询第4、5个数
54     cout<<"第4个数:"<<query(&ver_A,rank,num_B,4)<<endl;
55     cout<<"第5个数:"<<query(&ver_A,rank,num_B,5)<<endl;
56 
57     delete [] num;
58     delete [] rank;
59     delete [] num_B;
60     return 0;
61 }
View Code

6.注意

  (1)程序中以一维数组为例,其实多维数组也是连续存储,也可以理解为“一维数组”。

  (2)SSE指令时间复杂度为O(1),但是SSE指令操作位数有限。

  (3)如果Vec-A比特向量很长时,可以先计算一些rank数据保存下来(空间换时间),也可以达到计算任意位置rank操作时间复杂度为O(1)。

 

本文连接:http://www.cnblogs.com/xudong-bupt/p/3787658.html

参考链接:

SIMD : http://en.wikipedia.org/wiki/SIMD

_mm_popcnt_u32: http://msdn.microsoft.com/zh-cn/library/bb514083.aspx

SSE: http://en.wikipedia.org/wiki/SSE5

 

相关文章
都8102年了,还用fastq-dump,快换fasterq-dump吧
之前写过一篇文章Fastq-dump: 一个神奇的软件, 详细介绍了fastq-dump的用法。 虽然fastq-dump参数很多,而且一直被吐槽参数说明写的太差,但是如果真的要用起来其实也就是一行代码 fastq-dump --gzip --split-3 --defline-qual &#39;+&#39; --defline-seq &#39;@$ac-$si/$ri&#39; SRRXXXXX| SRRXXXX.sra # 加上--gzip后需要时间进行文件压缩 当然除了参数问题,还有一个让人诟病的地方就是他只能单个线程,所以速度特别的慢。
5829 0
都8102年了,还用fastq-dump,快换fasterq-dump吧
|
搜索推荐
解释什么是不稳定排序
本段内容介绍排序算法的稳定性。当排序时存在多个值相等的元素(如红桃五和黑桃五),若它们在排序前后的相对位置保持不变,则该排序算法是稳定的;反之,若其顺序发生变化,则为不稳定排序算法。
143 0
|
11月前
|
边缘计算 缓存 人工智能
EdgeShard:通过协作边缘计算实现高效的大语言模型推理——论文解读
EdgeShard是一种基于协作边缘计算的大语言模型(LLM)推理框架,旨在解决LLM在云端部署面临的延迟高、带宽压力大和隐私泄露等问题。通过将LLM分片部署在多个边缘设备上,结合云边协同与设备间协作,EdgeShard实现了高效的模型推理。其核心创新包括:联合设备选择与模型划分优化、支持流水线并行与微批处理、提出EdgeShard-No-Bubbles策略以减少设备空闲时间,从而显著提升推理吞吐量并降低延迟。实验表明,EdgeShard在异构边缘设备上可实现高达50%的延迟降低和2倍的吞吐量提升,支持全精度模型推理而无精度损失,为资源受限的边缘环境提供了高效的LLM部署方案。
1938 2
|
存储
计算机组成原理(7)----CPU内部单总线数据通路
计算机组成原理(7)----CPU内部单总线数据通路
2360 0
|
小程序 前端开发 算法
前端(十六)——微信小程序语音转文字,文字转语音功能的实现
前端(十六)——微信小程序语音转文字,文字转语音功能的实现
3302 0
|
存储 Windows
TortoiseSVN 详细操作指南
这篇文章提供了一份详细的TortoiseSVN使用指南,涵盖了版本库的概念、图标重载、右键菜单操作、日常版本控制操作如项目入库、检出工作副本、导出项目、添加和删除文件、放弃修改、查看和提交修改,以及如何解决常见的SVN使用问题。
TortoiseSVN 详细操作指南
|
Ubuntu 网络协议
Ubuntu20.04配置静态ip
配置Ubuntu 20.04使用静态IP地址是一个简单直接的过程,特别是借助于Netplan工具。遵循上述步骤,您可以轻松完成静态IP配置,为您的设备提供一个稳定和不变的网络地址。
3182 2
|
缓存 算法
KV cache复用与投机采样问题之多轮对话复用KV cache对FTT变长问题如何解决
KV cache复用与投机采样问题之多轮对话复用KV cache对FTT变长问题如何解决
1071 0