[发明专利]基于双向位图的稀疏矩阵压缩存储方法有效
申请号: | 201910003397.2 | 申请日: | 2019-01-03 |
公开(公告)号: | CN109740023B | 公开(公告)日: | 2020-09-29 |
发明(设计)人: | 甘新标;曾瑞庚;吴涛;杨志辉;孙泽文;刘杰;龚春叶;李胜国;杨博;徐涵 | 申请(专利权)人: | 中国人民解放军国防科技大学 |
主分类号: | G06F16/901 | 分类号: | G06F16/901 |
代理公司: | 长沙中科启明知识产权代理事务所(普通合伙) 43226 | 代理人: | 任合明 |
地址: | 410003 湖*** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 本发明公开了一种双向位图的稀疏矩阵压缩存储方法,目的是减少存储空间。技术方案为:仅保留存储一个或者多个顶点或边的起始位置来压缩图的邻接矩阵按行压缩存储数据结构,在行列两个方向使用位图数组来辅助识别顶点的边信息。具体方法包括:读取图的邻接矩阵按行压缩存储数据结构;构建改进型位数组;计算偏移量;构建行方向位图数组,由改进型位数组和行方向位图数组压缩存储行数组;计算列数组连续片段长度并构建连续片段二元组集合;构建简化列数组和列方向位图数组,由简化列数组和列方向位图数组压缩存储列数组。可以将图数据存储空间在行方向位图数组的基础上进一步压缩,极大规模扩大图的应用规模,优化采用图结构的应用程序的性能。 | ||
搜索关键词: | 基于 双向 位图 稀疏 矩阵 压缩 存储 方法 | ||
【主权项】:
1.一种基于双向位图的稀疏矩阵压缩存储方法,其特征在于仅保留存储一个或者多个顶点或边的起始位置来压缩图的邻接矩阵按行压缩存储数据结构,分别在行列两个方向使用位图数组来辅助识别顶点的边信息,具体包括以下步骤:第一步、读取图G的邻接矩阵CSR存储数据结构,即按行压缩存储数据结构,包含列数组colums[V”]和行数组rowstarts[V'],V',V”均为正整数,V'=NV+1,V”为非零元的个数,rowstarts[V']中的每一个元素为int整型量,表示对应非零元的行索引偏移,列数组colums[V”]中每一个元素为int整型量,表示对应非零元的列位置编号;第二步、简化行数组rowstarts[V'],构建改进型位数组,具体方法如下:2.1.统计rowstarts[V']数组中不同元素的个数,记为Vb,并定义数组rowstarts'[Vb]来存放这Vb个元素;2.2.将rowstarts[V']数组中Vb个不同元素依次分别表示为rowstarts'[0],rowstarts'[1],…,rowstarts'[n],…,rowstarts'[Vb‑1],n=0,1,2,…,Vb‑1;2.3.定义具有Vb个元素的改进型位数组CSR‑rowstarts'[Vb];对CSR‑rowstarts'[Vb]进行赋值,将数组rowstarts'[Vb]中Vb个元素依次赋值给数组CSR‑rowstarts'[Vb];第三步、计算偏移量,具体方法如下:3.1.定义有NV个元素的偏移数组offset[NV];3.2.定义变量j'=0;3.3.若j'<NV,转3.4;否则,转3.7;3.4.offset[j']=rowstarts[j'+1]‑rowstarts[j'],即计算相应的行非零元的个数;3.5.j'=j'+1;3.6.若j'<NV,转3.4;否则,3.7;3.7.偏移量计算完成,得到偏移数组offset[NV];第四步、构建行方向位图数组,由改进型位数组CSR‑rowstarts'[Vb]和行方向位图数组压缩存储行数组rowstarts[V']全部信息,方法如下:4.1定义有NV个元素的行方向位图数组row‑bitmap[NV];row‑bitmap[NV]中的每一个元素仅有一个bit位,用来表示两个顶点之间是否有边,1表示有边,0表示无边;4.2定义变量k=0;4.3若k<NV,转4.4;否则,转4.7;4.4若offset[k]≠0,转4.5;否则,转4.6;4.5bitmap[k]=1,表示顶点之间有边,转4.7;4.6bitmap[k]=0,表示顶点之间无边,转4.7;4.7k=k+1;4.8若k<NV,转4.4;否则,转4.9;4.9位图数组row‑bitmap[NV]构建完毕;第五步、计算列数组colums[V”]连续片段长度并构建连续片段二元组集合,方法是:5.1.定义二元组集合F中存放形如<colums,len>的二元组,<colums,len>表示每个连续片段列位置编号colums连续出现了len次,len≥1,colums是连续片段列位置编号,len是colums连续出现的次数,且len,colums均为正整数;5.2.定义循环变量m=0,令len=1;5.3.定义当前位置cur=m;5.4.若cur<V”,转5.5,否则,转第六步;5.5.若colums[cur]==colums[m+1],转5.6,否则,转5.9;5.6.len=len+1;5.7.colums=colums[cur];5.8.m=m+1;5.9.若m<V”,转5.5,否则,转5.9;5.10.将二元组<colums,len>以元素形式加入集合F,即,F=F+{<colums,len>};5.11.cur=cur+len,转5.4;第六步、依据二元组集合F构建简化列数组和列方向位图数组,由简化列数组和列方向位图数组压缩存储列数组colums[V”]全部信息,具体方法如下:6.1.统计二元组集合F中的元素个数,记为s1;6.2.统计二元组集合F中的元素的第二元信息len≥2的个数,记为s2;6.3.令尺度变量size=s1+s2;6.4.定义含有size个元素的简化列数组colums'[size];6.5.定义列方向位图数组column‑bitmap[size],列方向位图数组中的元素1表示连续片段,列方向位图数组中的元素0表示非连续片段;6.6.定义集合F‑tmp=F;6.7.定义变量s=0;6.8.若从集合F‑tmp中任取一个元素,令此元素为二元组f,转6.9,否则,转第七步;6.9.将二元组f从集合F‑tmp中删除,即令F‑tmp=F‑tmp‑{f};6.10.若f.len=1,f.len表示二元组f的len值,转6.11;若f.len≥2,转6.14;6.11.令colums'[s]=f.colums,f.colums表示二元组f的colums值;6.12.令column‑bitmap[s]=0,表示对应的列编号不是连续片段的起始列编号;6.13.s=s+1;转6.20;6.14.令column‑bitmap[s]=1,表示对应的列编号是连续片段的起始列编号;6.15.令colums'[s]=f.colums;6.16.s=s+1;6.17.column‑bitmap[s]=0,表示连续片段的长度值并不是连续片段的起始列编号;6.18.令colums'[s]=f.len;6.19.s=s+1;6.20.若s<size,转6.8,否则,转第七步;第七步、结束。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科技大学,未经中国人民解放军国防科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201910003397.2/,转载请声明来源钻瓜专利网。