CN104809161A - 一种对稀疏矩阵进行压缩和查询的方法及系统 - Google Patents
一种对稀疏矩阵进行压缩和查询的方法及系统 Download PDFInfo
- Publication number
- CN104809161A CN104809161A CN201510152316.7A CN201510152316A CN104809161A CN 104809161 A CN104809161 A CN 104809161A CN 201510152316 A CN201510152316 A CN 201510152316A CN 104809161 A CN104809161 A CN 104809161A
- Authority
- CN
- China
- Prior art keywords
- tree
- leaves
- rank
- value
- sparse matrix
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Abstract
本发明涉及一种对稀疏矩阵进行压缩和查询的方法及系统。该方法对k2-tree方法进行了改进:一是rank操作的改变,二是对于一般矩阵和非零一矩阵的处理。首先对待处理的稀疏矩阵进行预处理,得到单元值为0或1且为方阵的稀疏矩阵A;然后采用k2-tree算法得到数组T(tree)和L(leaves),根据T(tree)中的信息对Rank数组间隔固定位数进行存储,得出Rank(tree),并根据L(leaves)和对应的原稀疏矩阵得到V(leaves)和rank(leaves)值,输入查询单元的坐标后,可查询得出稀疏矩阵A中存储的数值。本发明可以有效地压缩稀疏矩阵,使查询速度更快,存储空间更节省。
Description
技术领域
稀疏矩阵广泛应用在信息安全、内容过滤、图计算等领域,本发明旨在针对于稀疏矩阵存在的占用空间大,信息稀疏等问题,对稀疏矩阵进行压缩,可支持对稀疏矩阵直接进行查询访问。
背景技术
稀疏矩阵可应用在信息安全,内容过滤等多个方面。在内容过滤、信息安全方面,字符串匹配问题在入侵检测、病毒检测、文本检索、搜索引擎、生物计算等方面都有广泛的应用。串匹配算法分类方法有很多,按照算法所使用的数据结构,可分为基于查表的匹配算法和基于自动机的匹配算法:用散列表的形式存储模式串,匹配过程即是查找散列表的过程,这种方法称为基于查表的匹配算法;基于自动机的匹配算法是将模式串集合用自动机进行存储,匹配过程就是状态转移过程。由于基于自动机的匹配算法性能稳定,适用范围广,在许多领域,比如网络数据流处理应用的各个领域中被广泛采用。然而,基于自动机的方法所需要的存储空间大,匹配速度慢。并且,随着应用需求的不断增长,系统中的规则数量的也在急剧增加,所以基于自动机的匹配算法空间占用急剧增大,使得匹配性能下降,算法局部性变差,进而影响了整个系统的吞吐率。由于基于自动机的匹配算法中最终存储大多以稀疏矩阵的形式展现,所以怎样对稀疏矩阵进行压缩,并且能够快速进行访问日益受到研究者的注意。
在其他领域中,由于不同场景的产生,稀疏矩阵也应运而生。在图计算领域中,将网页当作节点,网页之间的链接关系当作转移:若一个页面A链接到另一个页面B,则A到B的转移边为1,否则为0。那么就可以将网页的链入链出关系看做是自动机的转移,随着网页数目的不断增多,往往页面的链入链出关系集中在某些密集的区域,对于整个网络图结构而言,0的个数也是相当庞大的。所以在存储这些信息时,稀疏矩阵是一种直观而有效的方式,它能对这些网页信息进行记录,从而使研究者可以分析网络图之间的结构、行为。在社交网络中,每个人当作节点,人与人的关系当作转移:当人与人之间是朋友时,他们之间的转移边为1,否则为0。所以社交网络中人和人的关联也可以看成是网络图结构,而存储这些节点和边时,往往也用稀疏矩阵来对其记录。在图像处理中,像素点可以看作矩阵单元,当图像为二值图像(如医疗图像),即矩阵单元只需存储0或1的值,稀疏矩阵也就能存储图像信息。随着现今数据规模的快速增长,存储空间爆炸等问题出现,稀疏矩阵的压缩也就越来越受到人们的重视。
矩阵中非零元素的个数远远小于矩阵元素的总数则称该矩阵是稀疏矩阵。稀疏矩阵所占用的空间大,所存储的信息大多是零,现今在数学中对其多数采用三元组的方法进行存储。然而针对稀疏矩阵空间占用大,信息存储冗余的现象,传统的三元组的方法已经不能满足现在的需求。
因此,研究稀疏矩阵的压缩方法,并能有效地对其进行直接访问,在现今的图计算、内容过滤、信息安全等诸多方面都有广泛应用。
在文献“[1]:Nieves R.Brisaboa Susana LadraK2-trees for Compact Web GraphRepresentation.String Processing and Information Retrieval Lecture Notes in Computer ScienceVolume 5721,2009,pp 18-30.[2]:Nieves R.Brisaboa Susana LadraCompact Representation ofWeb Graphs with Extended Functionality.Information Systems 39(1):152-174,2014.”中研究者提出了一种k2-tree的方法,用来解决网络图结构中关联矩阵的压缩问题。它的主要思想是将矩阵按照树的结构存储从而减少不必要的0的个数。为了简便叙述,先讨论矩阵是方阵的情况,矩阵单元的值只有0或1(若原来稀疏矩阵中的值除了0和1外还有其他值,将值转化为1)。方阵是矩阵的一种,它的特殊之处在于行和列的长度相同。k2-tree方法分为构建和查询两个过程,具体步骤表述如下。
1)构建过程如下:
将方阵的行和列平均分为k块,那么可以将方阵分为k2个子方阵。对于每个子方阵,若里面含有不全为零的数值,那么这个子方阵对应的节点为1,否则为0。如果节点为1,那么继续将子方阵分为k2块,直到边长少于k或者子方阵中的值全为0为止。由此可见,树的高度为(n是方阵的宽度)。
构建过程中的树结构有以下特点:它根节点的孩子共有k2个节点,这k2个节点称之为第0层,每个节点代表一个子方阵,节点的值为1或者0(子方阵中的值全为0时节点值为0,否则为1);值为1的节点又有k2个子节点……直到遍历到方阵中元素。
优化策略:增添rank操作
在上述两个文献中,为了使得查询简便,研究者增加了rank操作。rank操作是为了减少查询时间所提出的。rank操作原始目的是为了压缩存储k叉树,理论上能在O(1)的时间复杂度进行。定义Rank(T,m)表示对于数组T,它从第一个位置为1的点到第m个位置之前1的个数。它的目的是为了在查询过程能够快速定位孩子节点的位置,从而获取孩子节点的信息。
综上所述,构建过程的存储结构分为三个:
·T(tree):以比特位的形式存储高度为h-1的所有节点,存储的顺序按照高度递增的形式从左至右进行。首先存储根节点的k2个子节点(即第0层),然后存储下一层的节点,直到第h-2层。
·Rank(tree):存储T(tree)中当前位置之前(包含自身)1的个数。
·L(leaves):存储最后一层的节点,即第h-1层的节点。它表示原来方阵单元的真实信息。
例如图1:原方阵是一个行宽为4的矩阵,k=2。按照k2-tree的方法得到的树结构如图所示。原始的方阵被分为4个子方阵,其中第二个和第三个子方阵内部的值全为0,对应的节点值为0;其他的子方阵还存在1的值,对应的节点值为1。然后将子方阵阵再次分割成4个子方阵,得到了第二层节点值,由于新得出的子方阵不能再次分割,所以结束树结构的构建。其中第0层的节点为1001,第1层的节点为11011110。每次分成的子方阵存储的顺序以行优先存储,即为左上、右上、左下和右下。可知:T(tree)=1001,Rank(tree)=1112,L(leaves)=11011110。由此。构建过程完毕,当查询原方阵某个单元时,利用前面所叙述的三个结构,即可以进行直接查找。接下来介绍查询过程的步骤。
2)查询过程步骤如下:
初始时,原方阵的行(或列)的宽度为n.
步骤一:根据所要查询的单元A[p][q](p,q为查询单元的横纵坐标)计算它属于当前k2个子方阵A’[0,1,……,k2-1]中的第几个子方阵,然后查找这个子方阵在T(tree)中对应的第m个位置的值。m的值可由公式1得出,公式1中x代表T(tree)中的第x个位置,n为每次方阵的规模。初始时,Rank(T,x)=0。
公式1
步骤二:T(tree)中第m个位置的值为0,说明子矩阵中全为0,则直接返回A[p][q]=0;
步骤三:T(tree)中第m个位置的值为1,说明子矩阵中还有值为1的单元,那么查询Rank(tree)中的第m个位置对应的值,假设为i,那么子方阵再次分割为k2个子方阵时在T(tree)的第i·k2个位置,若i·k2大于T(tree)的长度(用len(T)表示),说明查询的值已经在L(leaves)中了,查询L(leaves)中的第i·k2-len(T)位置的值,即为A[p][q]的值;若i·k2小于等于len(T)那么说明查询位置还在T(tree)中,那么A[p][q]在T(tree)中第i·k2到第(i+1)·k2位置中。那么在子方阵中继续进行查找,将子方阵当作下一步分析的方阵,转到步骤一,此时Rank(T,x)=m,直到查询的值为0或者查询到L(leaves)中为止。
示例:如图1所示,k=2,T(tree)=1001,Rank(tree)=1112,L(leaves)=11011110。查找A[3][3]时,先判断这个单元在原方阵中第4个子矩阵中,所对应的值是T(tree)中的第4个值为1,说明这个子矩阵可以分割,查看Rank(tree)的第4个值为2,说明子方阵对应T(tree)||L(leaves)(||代表连接,两个数组前后相连接)的第8个到第12个位置,由于len(T)=4,所以查询的位置在L(leaves)中的第4个到第8个位置;然后查询这个子方阵,先判断出A[3][3]在子方阵的第4个子方阵中,即L(leaves)的第8个位置值为0,则返回A[3][3]=0.
发明内容
本发明可以将稀疏矩阵进行有效的压缩,并且可以实现直接访问。k2-tree方法中稀疏矩阵转化为树的结构进行存储,可以使得存储数目明显减少。本发明将k2-tree中的存储结构、存储范围和存储对象进行了扩充,使查询速度更快,存储的空间更节省。
本发明对k2-tree方法的改进包括两个方面:一是rank操作的改变,二是对于一般矩阵和非零一矩阵的处理。下面进行具体说明。
优化一:rank操作的改变
实际操作中,对于Rank(T,m)的存储可以间隔固定位数(比如每隔w位)存储一次,再进行下文的查询过程时,可以先判断T(tree)在Rank(tree)中对应的位置,例如查询T(tree)中第m个位置,那么对应的Rank(tree)值为然后假设从到T(m)之间共有s个1,那么下面详细介绍一下具体过程。
原始的算法是将T(tree)对应的每个位置都要存储,而改进后,会间隔固定位数进行存储,间隔的位数可表示为2j位,比如8位、16位,32位,64位等。例如间隔4位进行存储,也就是说每4位记录一次Rank数组的存储,最后不足4位的不必记录。这样做的好处是一方面可以减少Rank数组的空间,另一方面,在查询时只需要判断当前T(tree)位置在Rank中的位置和相应值,就可以进行查询了。设输入的查询单元的横纵坐标为p和q,则具体的查询过程是:
1)首次查询时根据所要查询的单元A[p][q]计算它属于第个方阵,则首次查询Rank(tree)中的第m=f个位置,设间隔位数为2j,若f<2j,则T(tree)中的第f个位置为T(f);否则,查询Rank(tree)的第个位置的值再加上从T(tree)第位置到第f个位置记录有g个1,则记录原方法中 转到步骤3);
2)从第二次查询开始,从上次得到的Rank(T,x)得到本次查询的单元A[p][q]在T(tree)的位置m,其中x代表T(tree)中的第x个位置,n为当前矩阵的列宽或者行宽,m由下面公式得出:
根据A[p][q]计算它属于当前k2个子方阵A’[0,1,……,k2-1]中的第f个方阵,然后根据m值查找Rank(tree)的值:若m<2j,则T(tree)中第m个位置的值T(m);否则,查询Rank(tree)的第个位置的值再加上从T(tree)第位置到第m个位置记录有g个1,则记录原方法中转到步骤3);
3)若T(m)=0,说明子方阵中全为0,直接返回A[p][q]=0;否则转到4);
4)若T(m)=1,说明子方阵中还有存在值为1的单元,根据Rank(T,m)=i对T(tree)和L(leaves)进行操作:对T(tree)||L(leaves)向右移位至第i·k2位,其中||表示两个数组拼接,如果i·k2<len(T),其中len(T)指T(tree)的长度,那么说明查询位置还在T(tree)中,那么A[p][q]在T(i·k2)到T((i+1)·k2)所表示的子方阵中,令n=n/k,p=pmod(n/k),q=qmod(n/k),x=m,转到2);如果i×k2>len(T),说明查询的值已经在L(leaves)中了,根据A[p][q]的单元坐标计算属于L(leaves)的第m-len(T)个位置,并返回L(m-len(T)),即A[p][q]=L(m-len(T));从而得出A[p][q]的值。
图2为行列大小均为8的稀疏矩阵及在k=2时分解的树结构,当k=2时,图2中的例子可以表示为:
T(tree)=1111 1111 0010 1100 1000 Rank(tree)=4 8 9 11 12
L(leaves)=0111 0011 1000 1100 0110 1000 1110 0100
将Rank(tree)数组每4位为一块,每一块记录1个Rank(tree)中的数值。示例如下:当查询稀疏矩阵单元A[3][4]时,由k2-tree方法可以确定首次A[3][4]在第2个子方阵中,即在T(tree)的第2个位置。由于2<4,还没有到首个Rank(tree)所存储的值位置。所以只在T(tree)前4位中查询到第2个位置为止1的个数,共2个,所以首次返回的Rank(tree)值为2。
当按照算法第2次进行查找时,确定在第3个小子方阵的位置,故查找到T(tree)第11个位置(2*4+3=11),值为1。由于则查找到Rank(tree)的第2个位置,即原来Rank(tree)的第8个位置(值为8),所以还要在T(tree)从第8个位置向后数3个位置看有几个1,查出最终T(tree)第11个位置的Rank(tree)的值为9,继续查找。
最后一次查找,首先确定在T(tree)的位置,由于上次Rank(tree)的值为9,即是第36个位置,但是已经超出了的长度,所以已经查询到了叶子节点,在L(leaves)里从第16个位置往后查找,由于在子矩阵的第3个位置,所以值为1,即A[3][4]=1,查找结束。
这样改进的原因是根据实际应用产生的,SSE4(Streaming SIMD Extensions 4)扩展指令集支持32位、64位的指令popcnt。例如对于32位的指令int_mm_popcnt_u32(unsigned int a),它返回32位无符号整形a中比特位为1的位的个数。这些指令对于rank操作十分高效。
然而,由于每次记录的是一块的1的比特个数,具体的位置的1的信息需要查询位数确定,所以,在块的大小选择和存储空间之间需要实践者做出折中。
优化二:对于一般矩阵和非零一矩阵的处理
本文所介绍的内容只对方阵并且单元值为0或1的稀疏矩阵做了介绍,并没有考虑矩阵边长是否可以整除k、矩阵不是方阵和矩阵单元值不仅仅是0或者1的情况。在实际应用中,不可能每次处理的都是符合方阵并且单元值只有0或1的情形,所以针对上面的问题,本文说明在实际中所做的处理。
1、当稀疏矩阵不是方阵时,设稀疏矩阵大小是M·N(或N·M),且M>N,则可以将矩阵大小转化为M·M,多出来M·M-M·N个单元填充0,即可转化为方阵。如果M不能被分块大小k的整数幂整除,那么令原矩阵转化为kB·kB规模的方阵,多余位置kB·kB-M·N填0。然后再按照上述方法进行构建和查找过程。
2、当单元值是除0和1以外的数值时,先把非0单元转化为1,按照上述方法存储T(tree)、Rank(tree)和L(leaves),然后另开辟与L(leaves)对应的两个结构V(leaves)和rank(leaves)。其中V(leaves)顺序存储L(leaves)中1对应原矩阵的真实数据,rank(leaves)存储L(leaves)中当前位置m之前(包含自身)1的个数,即rank(m)。查询时若L(leaves)中对应位置为1,查找V(rank(m))就可以找到真实的数据。其实,rank(leaves)的存储可以利用优化一的操作,减少rank(leaves)的存储空间,但是查找时需要额外的时间对L(leaves)进行操作。为了叙述简单,现不做对其优化处理。
例如得到的L(leaves)是:L(leaves)=11011110,其真实值按顺序分别为12、11、0、1、5、8、9、0.那么V(leaves)和rank(leaves)见表1所示。如果查询到L(leaves)中为0时,直接返回查询的值为0,如果查询到L(leaves)中为1时,由于此时矩阵中除了0或1的单元值,还会有别的单元值,所以1不一定就是真正的值。因此,需要在V(leaves)和rank(leaves)进行寻找。例如,如果查询到标号为6的L(leaves)值为1,那么只需要查询V(rank(6)),就可以得到真实值为8。
标号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
L(leaves) | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
V(leaves) | 12 | 11 | 1 | 5 | 8 | 9 | - | - |
rank(leaves) | 1 | 2 | 2 | 3 | 4 | 5 | 6 | 6 |
表1 示例中L(leaves)、V(leaves)和rank(leaves)的值
本发明中,构造使稀疏矩阵压缩的系统主要包含以下部件,如图3所示:
1)系统预处理部件:包括设定分块大小k;输入矩阵将不能整除k的整数幂或者矩阵不是方阵的进行转化,使得转化后变为长宽均为n的方阵。
2)构建节点树部件:上个部件所得的方阵通过k2-tree算法得到数组T(tree)和L(leaves)。
3)创建辅助信息部件:给定固定位数的间隔,并通过T(tree)中的信息得出Rank(tree);并得到L(leaves)中对应的V(leaves)和rank(leaves)值。
4)查找信息部件:输入查询单元的横纵坐标p,q。
5)查询结构部件:已知p,q以及T(tree)、L(leaves)以及辅助信息数组Rank(tree)、V(leaves)和rank(leaves)结构,通过查询过程算法得出矩阵中存储的数值。
6)生成数据部件:根据查询过程的算法得到最终数值,并输出。
本发明基于一种新型压缩算法,能够将稀疏矩阵压缩至一维结构,并且支持直接查询,其有益效果具体体现在以下两个重要方面:
1、在信息安全、内容过滤方面,往往将正则表达式生成的DFA(deterministic finiteautomation,确定有限状态自动机)以稀疏矩阵的形式存储。由于DFA状态数目多,呈指数级增长,容易引起空间爆炸,所以如何更好地降低空间大小是关键。本发明可以将稀疏矩阵进行高效率的压缩,降低稀疏矩阵中0的个数,加之本发明存储的结构按照比特位进行,所以极好地降低了空间占用率。当进行DFA匹配时,由于本发明支持直接查询,无需对空间进行扩大,所以查询速度极快。
2、在图计算方面,各种网络图结构层出不穷,随着网络流量的增加,网络图结构所需要存储的空间也不断增大。利用本发明的算法,研究者就很容易将关联的稀疏矩阵进行压缩并存储。只需要将其进行压缩到一定的存储结构,对其进行记录。当定位某个节点时,只需要通过本发明的查询过程进行快速定位就能得到某个单元的具体数值,而无需寻找原始关联矩阵的信息。
附图说明
图1为k=2时行列大小均为4的稀疏矩阵分解成树形结构示意图。
图2为行列大小均为8的稀疏矩阵及在k=2时分解的树结构。
图3为压缩稀疏矩阵系统部件图。
图4为原矩阵和优化后的稀疏矩阵。
图5为三种数据集在四种压缩方法下所占空间比较图。
图6为三个数据集在k2-tree压缩方法不同参数下速度比较图。
图7为三个数据集在k2-tree压缩方法不同参数下空间比较图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步说明。
本发明中,构造使稀疏矩阵压缩的系统具体实施方式如下:
1)对稀疏矩阵进行预处理操作,得到合适稀疏矩阵;
对于要处理的稀疏矩阵,先要设定分块大小k;若稀疏矩阵不是方阵先按照优化方法转化为方阵;若稀疏矩阵存储的值不是0或1,则对其先转化为0和1的稀疏矩阵,再暂存原矩阵,方便后面对V(leaves)和rank(leaves)值的确定。最终得到合适的稀疏矩阵A及其规模行高为n。将稀疏矩阵加载至内存。
2)通过稀疏矩阵A和分块大小k利用构建过程的算法构建节点树并得到T(tree)和L(leaves);
根据预处理操作得到k、合适的稀疏矩阵及其规模行高为n,然后根据k2-tree算法得到数组T(tree)和L(leaves)。
3)通过T(tree)、L(leaves)和原稀疏矩阵得到辅助信息;
通过T(tree)中的信息,并给定固定位数的间隔,从而得出Rank(tree)。从得到的L(leaves)和对应的原稀疏矩阵得到V(leaves)和rank(leaves)值。
4)输入查询单元信息;
输入查询单元的横纵坐标p和q.
5)利用查询过程提供的算法和需要查询的单元坐标来查询单元的值;
通过原始横纵坐标p和q按照查询过程的算法得出A[p][q]的值,若A[p][q]=1并且原始矩阵不是零一矩阵(矩阵单元除了0和1以外还有其他的数值的矩阵)时,记录L(leaves)对应的信息,利用优化二中的方法利用V(leaves)和rank(leaves)信息查找数据原始值。
6)生成结果数据;
根据查询过程的算法得到最终数值,并输出。
为了叙述步骤,下面举例说明实施方式各个步骤的情况。
1)如图4所示,原稀疏矩阵是图4左所示的情况,是一个行列均为6的矩阵,且为非零一矩阵。假设我们设定的分块大小k=2,那么由于6不能整除4(2的整数幂次方),所以需要将矩阵转化为行列为8的方阵,如图4右。并暂存原矩阵,以便于当存储L(leaves)时对于rank(leaves)数组需要对原矩阵不为零的部分进行存储。
2)对于图4右面的稀疏矩阵,分块大小k=2,那么,利用k2-tree方法得到构建的节点树(见图2)、T(tree)和L(leaves)的数值为:
T(tree)=1111 1111 0010 1100 1000
L(leaves)=0111 0011 1000 1100 0110 1000 1110 0100
3)通过T(tree)、L(leaves)和原稀疏矩阵得到辅助信息。如果设定固定间隔4位进行存储Rank(tree),得到Rank(tree)=4891112。从得到的L(leaves)和原稀疏矩阵通过坐标对应的关系得到V(leaves)值,rank(leaves)值从最后的L(leaves)中进行统计。最终两个值信息如下:
V(leaves)=4 3 2 6 7 3 4 4 2 2 3 2 5 4 1
rank(leaves)=0 1 2 3 3 3 4 5 6 6 6 6 7 8 8 8 8 9 10 10 11 11 11 11 12 13 14 14 14 15 15 15
到这步,所有的储存工作结束,下面需要说明具体的查询单元步骤。
4)输入查询单元的横纵坐标p和q,例如,查询单元A[3][4]。
5)在优化一部分,讲述了如何利用T(tree)、L(leaves)和固定间距为4时的Rank(tree)来查询A[3][4]值的过程,最终得到A[3][4]=1,由于原稀疏矩阵是非零一矩阵,所以A[3][4]=1可能并不是真实值,下面简要说明怎样找到A[3][4]的真实值。在优化一中查询A[3][4]时,得知A[3][4]是在L(leaves)的第19个位置,即A[3][4]=L(18)=1,那么,此时L(leaves)所对应的rank(leaves)是rank(18)=10,则真实值是V(leaves)的第10个位置所对应的值,即A[3][4]=V(rank(18)-1)=V(9)=2
6)生成结果数据;根据查询过程的算法得到最终数值,并输出。输出A[3][4]=2.
基于本文所列出的发明内容,对于稀疏矩阵的压缩根据先前研究者所列出的方法,我们做了实验,对比基于本发明改进后的k2-tree的稀疏矩阵压缩算法(后文表格及附图将本发明的改进后的k2-tree方法仍简称为k2-tree方法)和BinarySearch、TripleArray、TetrisMatrix三种算法对ADFA(Accelerate deterministic finite automation,加速确定有限状态自动机)状态转移表压缩与访问效果。ADFA的具体方法参考文献是“Michela Becchi,Patrick Crowley,AnImproved Algorithm to Accelerate Regular Expression Evaluation,ANCS,2007”。实验数据是snort31、l7_g8_0、bro217三组正则表达式使用ADFA算法生成的状态转移表对应的有权稀疏矩阵,各条规则转化为ADFA所占用的节点数和边数见表2。实验中的时间是指将稀疏矩阵中全部非空的单元查询一遍的总时间除以非空的单元的总数;空间是算法初始化完成后其对应的存储结构占用的内存。
snort31 | l7_g8_0 | bro217 | |
Nodes | 5389 | 4245 | 7156 |
Edges | 14261 | 409457 | 207701 |
表2 snort31、l7_g8_0、bro217三组正则表达式所建造的ADFA节点和边的个数
表3 四种压缩方法的初始化时间,查询单个单元的速度及所占的空间
表4 k2-tree方法中不同参数下所得实验效果
表3是三组正则表达式在BinarySearch、TripleArray、TetrisMatrix和k2-tree四种算法的实验对比,很明显的看出k2-tree方法在稀疏矩阵的存储空间方面比其他几个算法都要小,但是查询时间相比其他三种算法比较多。其中b代表固定间隔的位数、k表示分块的大小。
表4是k2-tree方法在参数b、k值不同时对于三种数据集的初始化时间、查询时间和占用空间的统计结果。实验结果表明b值越大,存储空间越小,这是由于减少了Rank(Tree)的存储,每隔b位才进行一次存储Rank(Tree)的值;k的值和节点树的高度有关,k值越大,节点树的高度越低,那么查询的时间就会减少,上述实验结果也说明了这一点。
图5是在三种数据集(横坐标1,2,3分别代表snort31、l7_g8_0、bro217三组正则表达式,下同)下k2-tree、BinarySearch、TripleArray和TetrisMatrix四种算法压缩后空间的比较。其中TetrisMatrix方法只在数据集1下可以算出空间,其他数据集由于太大,运行时间过长,从而不能得出实验结果,所以图5中只在数据集1中有展现,具体数据见表3。根据图5可以看出,四种方法中采用本发明算法的压缩效果是最优的。这也说明本发明是切实有效的。
图6是在三种数据集下k2-tree算法中对于参数b和k值不同取值所得到的查询速度实验效果比较,通过这组折线图可以看出,三组数据在参数k=4,b=64的k2-tree方法下查询速度最快,所用时间最小。这说明,一方面k值越大,查询速度越快,查询时间越小;另一方面,b值是间隔位数存储一次rank,所以,在每次查询中b值越小,每次查询的间隔越小,不确定的查询次数越小,查询速度就越快。
图7是在三种数据集下k2-tree算法中对于参数b和k值不同取值所得到的占用空间的实验效果比较,通过这组折线图可以看出,三组数据集对于参数的选择表现的占用空间效果有些差异,但是三组数据集在b值增大的过程中占用空间是下降的趋势,同时,在b值一定的情况下,k值变化时,由于数据集本身的差异性,其变化趋势不明显。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。
Claims (6)
1.一种对稀疏矩阵进行压缩和查询的方法,其特征在于,包括如下步骤:
1)对待处理的稀疏矩阵进行预处理,得到单元值为0或1且为方阵的稀疏矩阵A,设其规模行高为n,并设定稀疏矩阵A的分块大小k;
2)根据分块大小k、稀疏矩阵A及其规模行高n,采用k2-tree算法得到数组T(tree)和L(leaves);
3)根据T(tree)中的信息对Rank数组间隔固定位数进行存储,得出Rank(tree),并根据L(leaves)和对应的原稀疏矩阵得到V(leaves)和rank(leaves)值,其中V(leaves)顺序存储L(leaves)中1对应的原稀疏矩阵的真实数据,rank(leaves)存储L(leaves)中当前位置m之前1的个数;
4)输入查询单元的坐标,根据该坐标以及T(tree)、L(leaves)、Rank(tree)、V(leaves)和rank(leaves),查询得出稀疏矩阵A中存储的数值。
2.如权利要求1所述的方法,其特征在于:步骤1)所述预处理,当稀疏矩阵不是方阵时,设稀疏矩阵大小是M·N,且M>N,则将矩阵大小转化为M·M,多出来的M·M-M·N个单元填充0,即可转化为方阵;如果M不能被分块大小k的整数幂整除,那么令原矩阵转化为kB·kB规模的方阵,多余位置kB·kB-M·N填0。
3.如权利要求1所述的方法,其特征在于:步骤3)所述间隔固定位数进行存储,间隔的位数为2j位。
4.如权利要求1所述的方法,其特征在于:步骤3)所述rank(leaves)间隔固定位数进行存储,以减少rank(leaves)的存储空间。
5.如权利要求1所述的方法,其特征在于:步骤4)设输入的查询单元的横纵坐标为p和q,则具体的查询过程是:
4-1)首次查询时根据所要查询的单元A[p][q]计算它属于第个方阵,则首次查询Rank(tree)中的第m=f个位置,设间隔位数为2j,若f<2j,则T(tree)中的第f个位置为T(f);否则,查询Rank(tree)的第个位置的值再加上从T(tree)第位置到第f个位置记录有g个1,则记录原方法中 转到步骤4-3);
4-2)从第二次查询开始,从上次得到的Rank(T,x)得到本次查询的单元A[p][q]在T(tree)的位置m,其中x代表T(tree)中的第x个位置,n为当前矩阵的列宽或者行宽,m由下面公式得出:
根据A[p][q]计算它属于当前k2个子方阵A’[0,1,……,k2-1]中的第f个方阵,然后根据m值查找Rank(tree)的值:若m<2j,则T(tree)中第m个位置的值T(m);否则,查询Rank(tree)的第个位置的值再加上从T(tree)第位置到第m个位置记录有g个1,则记录原方法中Rank(T,m)=转到步骤4-3);
4-3)若T(m)=0,说明子方阵中全为0,直接返回A[p][q]=0;否则转到4-4);
4-4)若T(m)=1,说明子方阵中还有存在值为1的单元,根据Rank(T,m)=i对T(tree)和L(leaves)进行操作:对T(tree)||L(leaves)向右移位至第i·k2位,其中||表示两个数组拼接,如果i·k2<len(T),其中len(T)指T(tree)的长度,那么说明查询位置还在T(tree)中,那么A[p][q]在T(i·k2)到T((i+1)·k2)所表示的子方阵中,令n=n/k,p=pmod(n/k),q=qmod(n/k),x=m,转到4-2);如果i×k2>len(T),说明查询的值已经在L(leaves)中了,根据A[p][q]的单元坐标计算属于L(leaves)的第m-len(T)个位置,并返回L(m-len(T)),即A[p][q]=L(m-len(T));从而得出A[p][q]的值;若A[p][q]=1并且原始矩阵不是零一矩阵时,记录L(leaves)对应的信息,利用V(leaves)和rank(leaves)信息查找数据原始值。
6.一种采用权利要求1~5中任一项所述方法的对稀疏矩阵进行压缩和查询的系统,其特征在于,包括:
系统预处理部件,用于对稀疏矩阵进行预处理,得到单元值为0或1的长宽均为n的方阵,并设定分块大小k;
构建节点树部件,用于对系统预处理部件所得的方阵通过k2-tree算法得到数组T(tree)和L(leaves);
创建辅助信息部件,用于给定固定位数的间隔,通过T(tree)中的信息得出Rank(tree),并得到L(leaves)中对应的V(leaves)和rank(leaves)值;
查找信息部件,用于输入查询单元的横纵坐标p,q;
查询结构部件,用于根据p,q以及T(tree)、L(leaves)以及辅助信息数组Rank(tree)、V(leaves)和rank(leaves)结构,通过查询过程得出矩阵中存储的数值;
生成数据部件,用于根据查询过程得到最终数值,并输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510152316.7A CN104809161B (zh) | 2015-04-01 | 2015-04-01 | 一种对稀疏矩阵进行压缩和查询的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510152316.7A CN104809161B (zh) | 2015-04-01 | 2015-04-01 | 一种对稀疏矩阵进行压缩和查询的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104809161A true CN104809161A (zh) | 2015-07-29 |
CN104809161B CN104809161B (zh) | 2018-08-21 |
Family
ID=53693983
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510152316.7A Active CN104809161B (zh) | 2015-04-01 | 2015-04-01 | 一种对稀疏矩阵进行压缩和查询的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104809161B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106469218A (zh) * | 2016-09-08 | 2017-03-01 | 中国科学院信息工程研究所 | 一种基于位图的布尔表达式存储、匹配方法和系统 |
CN107704617A (zh) * | 2017-10-25 | 2018-02-16 | 武汉科技大学 | 一种基于分级树形索引的关联数据的压缩方法 |
CN108804684A (zh) * | 2018-06-13 | 2018-11-13 | 北京搜狗科技发展有限公司 | 一种数据处理方法和装置 |
CN110413958A (zh) * | 2019-06-12 | 2019-11-05 | 中国科学院信息工程研究所 | 用于自动机空间压缩的线性同余字符集变换方法及系统 |
CN110705602A (zh) * | 2019-09-06 | 2020-01-17 | 平安科技(深圳)有限公司 | 大规模数据聚类方法、装置及计算机可读存储介质 |
CN111626415A (zh) * | 2019-02-27 | 2020-09-04 | 辉达公司 | 适用于人工神经网络的高效矩阵数据格式 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101630323A (zh) * | 2009-08-20 | 2010-01-20 | 中国科学院计算技术研究所 | 确定自动机的空间压缩方法 |
CN102891999A (zh) * | 2012-09-26 | 2013-01-23 | 南昌大学 | 一种基于压缩感知的联合图像压缩/加密方法 |
-
2015
- 2015-04-01 CN CN201510152316.7A patent/CN104809161B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101630323A (zh) * | 2009-08-20 | 2010-01-20 | 中国科学院计算技术研究所 | 确定自动机的空间压缩方法 |
CN102891999A (zh) * | 2012-09-26 | 2013-01-23 | 南昌大学 | 一种基于压缩感知的联合图像压缩/加密方法 |
Non-Patent Citations (3)
Title |
---|
NIEVESR.BRISABOA等: ""Compact representation of Web graphs with extended functionality"", 《INFORMATION SYSTEMS》 * |
YU ZHANG等: ""Delta-K2-tree for Compact Representation of Web Graphs"", 《APWEB 2014: WEB TECHNOLOGIES AND APPLICATIONS》 * |
张宇等: ""图数据表示与压缩技术综述"", 《软件学报》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106469218A (zh) * | 2016-09-08 | 2017-03-01 | 中国科学院信息工程研究所 | 一种基于位图的布尔表达式存储、匹配方法和系统 |
CN106469218B (zh) * | 2016-09-08 | 2019-11-19 | 中国科学院信息工程研究所 | 一种基于位图的布尔表达式存储、匹配方法和系统 |
CN107704617A (zh) * | 2017-10-25 | 2018-02-16 | 武汉科技大学 | 一种基于分级树形索引的关联数据的压缩方法 |
CN108804684A (zh) * | 2018-06-13 | 2018-11-13 | 北京搜狗科技发展有限公司 | 一种数据处理方法和装置 |
CN111626415A (zh) * | 2019-02-27 | 2020-09-04 | 辉达公司 | 适用于人工神经网络的高效矩阵数据格式 |
CN111626415B (zh) * | 2019-02-27 | 2023-10-10 | 辉达公司 | 适用于人工神经网络的高效矩阵数据格式 |
CN110413958A (zh) * | 2019-06-12 | 2019-11-05 | 中国科学院信息工程研究所 | 用于自动机空间压缩的线性同余字符集变换方法及系统 |
CN110413958B (zh) * | 2019-06-12 | 2020-12-04 | 中国科学院信息工程研究所 | 用于自动机空间压缩的线性同余字符集变换方法及系统 |
CN110705602A (zh) * | 2019-09-06 | 2020-01-17 | 平安科技(深圳)有限公司 | 大规模数据聚类方法、装置及计算机可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104809161B (zh) | 2018-08-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104809161A (zh) | 一种对稀疏矩阵进行压缩和查询的方法及系统 | |
US20080168061A1 (en) | Co-clustering objects of heterogeneous types | |
CN105320756A (zh) | 一种基于改进Apriori算法的数据库关联规则挖掘方法 | |
CN106897374B (zh) | 一种基于轨迹大数据最近邻查询的个性化推荐方法 | |
CN103116639A (zh) | 基于用户-物品二分图模型的物品推荐方法及系统 | |
CN104731925A (zh) | 基于MapReduce的FP-Growth的负载均衡并行计算方法 | |
CN105515997B (zh) | 基于bf_tcam实现零范围扩张的高效范围匹配方法 | |
CN103020163A (zh) | 一种网络中基于节点相似度的网络社区划分方法 | |
CN106326475A (zh) | 一种高效的静态哈希表实现方法及系统 | |
CN102968804A (zh) | 对稀疏有向图的邻接矩阵进行压缩存储的方法 | |
CN104424254A (zh) | 获取相似对象集合、提供相似对象信息的方法及装置 | |
CN104268629A (zh) | 一种基于先验信息和网络固有信息的复杂网络社区检测方法 | |
CN105357247A (zh) | 基于分层云对等网络的多维属性云资源区间查找方法 | |
CN104834709A (zh) | 一种基于负载均衡的并行余弦模式挖掘方法 | |
CN106844533B (zh) | 一种数据分组聚集方法及装置 | |
CN103631714A (zh) | 基于矩阵重复度的最小组合测试用例生成方法 | |
CN105959224A (zh) | 基于比特向量的高速路由查找装置及方法 | |
CN111861772A (zh) | 一种基于局部结构的密度最大化重叠社团发现方法及系统 | |
Luo et al. | Rethinking ResNets: Improved stacking strategies with high order schemes | |
CN102456073A (zh) | 一种部分最值查询方法 | |
CN104850591A (zh) | 一种数据的转换存储方法及装置 | |
CN108804582A (zh) | 基于大数据间复杂关系的图数据库优化的方法 | |
Yousuf et al. | Pool compression for undirected graphs | |
CN112148830A (zh) | 一种基于最大区域网格的语义数据存储与检索的方法及装置 | |
CN104484368A (zh) | 一种基于MapReduce的大规模图数据关键词搜索算法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |