一种DFA矩阵的压缩方法及装置
技术领域
本发明涉及数字处理领域,具体涉及一种确定的有限状态自动机(英文:Deterministic Finite Automaton,简称:DFA)矩阵的压缩方法及装置。
背景技术
随着互联网规模的爆炸式扩大以及网络技术的迅猛发展,网络安全问题也日益严峻,传统防火墙已不能满足如今复杂多变的网络安全需求。在这种情况下,业界开发了一种入侵检测系统(英文:Intrusion-Detection System,简称:IDS)。IDS是一种对网络传输进行实时监视,在发现可疑数据包时发出警报或者采取主动反应措施的网络安全系统,能够为计算机网络系统在面对内部攻击、外部攻击和误操作时提供实时保护,帮助计算机网络系统应付各种网络攻击。目前,IDS主要采用的入侵检测技术是深度包检测(英文:DeepPacket Inspection,简称:DPI)技术,其主要作用于开放系统互连(英文:Open SystemInterconnection,简称:OSI)参考模型的应用层。深度包检测技术用于实时地对数据包中包含的数据内容进行检测,通过判断数据包的数据中是否包含预定入侵规则中正则表达式所描述的特征(该判断过程称为正则表达式的匹配),过滤出满足预定入侵规则的数据包,并交由上级系统处理。该正则表达式具有灵活性、逻辑性和功能性强的特点,用于描述具有多种变化形式的入侵数据。正则表达式可以编译成DFA,该DFA可以按照状态跳转的方式进行正则表达式的匹配。
DFA是一个能实现状态转移的自动机,包括多个表示状态的结点以及这些状态结点之间的有向边(有向边可以称为转移边)。其中,多个表示状态的结点可以包括一个表示起始状态的结点、一个或多个表示终止状态的的结点,还可以包括一个或多个一般状态的结点。DFA从起始状态开始,逐个跳转字符地读入一个跳转字符串,每读入一个跳转字符就根据给定的转移函数从当前状态转移至下一个状态。在读完该跳转字符串之后,如果该自动机曾经转移到某个终止状态即表示匹配成功,即确定该数据包中存在该正则表达式所描述的数据特征,反之则表示正则表达式匹配失败。
目前,DFA一般采用图论中邻接矩阵的结构进行存储,这种邻接矩阵又称为DFA的跳转表。如图1所示,一个DFA对应一个跳转表,DFA中的每一个起始状态对应表中的一行,每一个跳转字符对应表中的一列。表中的每一个元素为一个状态,元素(i,j)表示第i个状态经过跳转字符j可以跳转到的状态。图1示出一种DFA以及该DFA对应的跳转表。然而,采用这种DFA的跳转表存在一个问题:当大量的正则表达式编译成DFA后,其占用的存储空间大,使得检索速度变慢。为了克服此问题,可以对正则表达式进行有效的分组,并将每个分组中的正则表达式进行合并编译,生成对应的DFA。这样,在利用某一个DFA检测数据包时,就可以对多个正则表达式同时进行匹配,从而达到减少存储空间和提高查找预定入侵规则速度的目的。但是,由于硬件芯片的存储空间有限,DFA的数据仍然较大,当使用硬件进行深度包检测时,从片外加载大尺寸的DFA数据会极大影响芯片性能。为了解决此问题,有研究人员提出一种识别和压缩DFA(英文:Recoganized and Compact DFA)的方法,该方法的主要流程步骤可以包括:
步骤1:输入DFA矩阵。
输入的DFA矩阵是经过分组哈希后所生成的N*M方阵,行与行之间是自然排序。在该DFA矩阵中,行代表状态号,而列代表跳转字符,N*M方阵中的元素代表跳转状态。
步骤2:按照DFA矩阵的行的相关性,对行进行划分。
由于输入的DFA矩阵之间是自然排序,不便于后续的压缩,因此步骤2的目的是将N*M矩阵根据行相关进行聚类,然后对矩阵进行重新排序,划分成逻辑上直观的矩阵。该矩阵所具有的特点是,相邻行之间的相似性较大。由于对整个DFA矩阵行进行了重新排序,跳转表中所代表的跳转状态也发生了改变,所以必须对原有状态号进行重新编辑。经过重新编辑行号后,新生成的DFA矩阵是一个经过聚类后,相邻行相关性较大的DFA矩阵。但新生成矩阵和步骤1中未经处理的DFA矩阵是同构的,仍然保持原有跳转表的状态对应关系。
步骤3:将DFA矩阵转换成位图、线性表和辅助数据结构,实现压缩。其中,位图表示矩阵的位图模式;线性表表示矩阵的基因信息;辅助数据结构表示位图编号和列的基址的对应关系。
所谓的位图,是对一个向量进行处理,每遇到第一个不同的状态,则位图中该位为1,其余为0。在步骤3中,对DFA矩阵的列向量进行位图处理,处理后的矩阵将成为一个01矩阵,1代表跳转状态发生改变,0代表该状态与该列之前最近的1所代表的状态相同。将位图按位存储,不同的模式分开存储,对于每一个位图,若其不足一个字节的则在其后补0。经过处理后的矩阵不再具有元素特性,形成一个模式矩阵,每一列代表一种位图模式,存储该矩阵中出现了不同的位图模式的次数以及位图模式的编号。而关于每一个矩阵的元素特性(以下称为基因),由于0表示与该列之前最近的1所代表的基因相同,因此只需保存在位图中为1的基因,将这些基因按列顺序存储,并将每列的起始位置进行记录,形成线性表。将线性表与位图编号进行匹配对应,生成一个<bitmapID,base>结构,bitmapID表示位图编号,base表示每列基因在线性表的基址。如果相邻两列的基因完全相同,则其后base值只需要与前一个base值相同,从而可以减少存储一列的基因,实现对线性表的压缩。
根据位图、线性表和辅助数据结构,可以还原一个完整的DFA矩阵。例如,当输入一个状态和一个跳转字符时,首先根据输入的跳转字符,在<bitmapID,base>数据结构中确定其所在的列号和位图模式,根据还原该列的数据信息,再根据输入的状态号,可以确定输出的跳转状态。
从以上可知,在将DFA矩阵转换成位图、线性表和辅助数据结构过程中,减少了位图中连续相同状态的数据的存储,以及减少了线性列表中完全相同的相邻列的基因的存储,从而实现对DFA矩阵的压缩,减少DFA数据占用的存储空间。
但是,上述方法是在DFA矩阵的列中具有连续相同状态的条件下才行之有效,容错率低,而且位图中的一位只能代表一个状态,仍然需要大量数据记录状态,DFA矩阵的压缩率不高。
发明内容
本发明提供一种DFA矩阵的压缩方法,通过本发明方法能够提高DFA矩阵的压缩率。
本发明第一方面提供了一种DFA矩阵的压缩方法,包括:
获取确定的有限状态自动机DFA矩阵;
将DFA矩阵的行分为若干组;
从分在同一组的行中分别选出每一列上出现次数最多的元素值,获得所述组的核,所述核为将选出的元素值按所属列的顺序排成的行;以及获得所述分在同一组的行中的特别元素值,所述特别元素值与所述核中对应的元素值不同,所述特别元素值所在的列与所述核中对应的元素值所在的列相同;
建立第一对应关系和第二对应关系,所述第一对应关系为所述组与所述核的对应关系,所述第二对应关系为所述特别元素值与所述特别元素值所在组、所在行及所在列的对应关系;
保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
结合本发明第一方面,在第一方面的第一种可能实现方式中,所述将DFA矩阵的行分为若干组,包括:
基于聚类算法,将DFA矩阵的行分为若干组,使得在同一组中,每一列上的相同元素的数量大于或等于预设值。
结合本发明第一方面的第一种可能实现方式,在第一方面的第二种可能实现方式中,所述基于聚类算法,将DFA矩阵的行分为若干组,包括:
根据DFA矩阵,构造赋权无向完全图;
从所述赋权无向完全图的权值中选取一个权值作为阈值;
根据所述阈值,将所述赋权无向完全图划分为边权值大于所述阈值的连通子图;
将属于同一个连通子图的DFA矩阵的行分为一组。
结合本发明第一方面的第二人种可能实现方式,,在第一方面的第三种可能实现方式中,在根据DFA矩阵,构造赋权无向完全图之后,所述方法还包括:将所述赋权无向完全图加入图集合;从所述图集合中选取未划分的赋权无向完全图进行划分;
所述从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:从选取的赋权无向完全图的权值中选取一个权值作为阈值。
结合本发明第一方面第三种可能实现方式,在第一方面的第四种可能实现方式中,在将DFA矩阵的行分为若干组之后,所述方法还包括:
计算第一存储空间和第二存储空间;所述第一存储空间为保存所述若干组所需的存储空间之和,其中每一组所需的存储空间包括每一组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;所述第二存储空间为保存所述DFA矩阵所需的存储空间,其中保存所述DFA矩阵所需的存储空间包括由DFA矩阵的所有行组成的组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;
当所述第一存储空间小于所述第二存储空间时,将所述连通子图标记为已划分的图,并加入所述图集合;
当所述第一存储空间大于所述第二存储空间时,将所述连通子图加入所述图集合;
所述保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:当所述第一存储空间小于所述第二存储空间时,保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
结合本发明第一方面或第一方面的第一至第四任意一种可能实现方式,在第一方面的第五种可能实现方式中,所述从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:从所述赋权无向完全图的权值中选取最小权值作为阈值。
结合本发明第一方面第二至第五任意一种可能实现方式,在第一方面的第六种可能实现方式中,所述赋权无向完全图的权值满足如下公式:
w(ri,rj)=C|hamdist(ri,rj)|
其中,w(ri,rj)表示赋权无向完全图的权值集合,ri表示DFA矩阵中第i行的元素,rj表示DFA矩阵中第j行的元素,i和j表示不同的行数,C表示DFA矩阵中行所包括的元素的个数,hamdist(ri,rj)表示海明距离函数。
结合本发明第一方面或第一方面的第一至第六任意一种可能实现方式,在第一方面的第七种可能实现方式中,所述保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:
将每一组的核组成核矩阵,保存所述核矩阵;将每一组的特别元素值组成特殊跳转表,保存所述特殊跳转表;
所述方法还包括:记录每一组的核在核矩阵中的地址,以及记录每一组的特别元素值在所述特殊跳转表中的地址。
结合本发明第一方面或第一方面的第一至第七任意一种可能实现方式,在第一方面的第八种可能实现方式中,在获取DFA矩阵之后,所述方法还包括:
将所述DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;其中,所述DFA矩阵中相同的列对应同一列编号;
根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的编号,建立所述DFA矩阵的字符映射表,所述字符映射表用于表示所述跳转字符与所述列编号的对应关系;
将所述DFA矩阵中相同的列进行合并,获得合并后的DFA矩阵;
所述将DFA矩阵的行分为若干组,包括:将合并后的DFA矩阵的行分为若干组。
结合本发明第一方面的第八种可能实现方式,在第一方面的第九种可能实现方式中,所述获取DFA矩阵,包括:
获取至少两个DFA矩阵;
所述将所述DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;包括:
将所述至少两个DFA矩阵的列进行编号,获得所述至少两个DFA矩阵的列编号;其中,所述至少两个DFA矩阵中所有相同的列对应同一列编号;
所述根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的列编号,建立所述DFA矩阵的字符映射表,包括:
根据所述至少两个DFA矩阵的列对应的跳转字符和所述至少两个DFA矩阵的列对应的列编号,建立所述至少两个DFA矩阵的字符映射表;
在建立所述至少两个DFA矩阵的字符映射表之后,所述方法还包括:
将所述至少两个DFA矩阵的字符映射表合并成所述至少两个DFA矩阵对应的共同的字符映射矩阵,其中,所述共同的字符映射矩阵的列对应的跳转字符用ASCII码表示,所述共同的字符映射矩阵的每一行对应所述至少两个DFA矩阵中的一个DFA矩阵;
将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,所述私有字符映射矩阵由所述共同的字符映射矩阵中的部分列组成,所述公有字符映射矩阵由所述共同的字符映射矩阵中的另一部分列组成;
将所述公有字符映射矩阵的行进行编号,获得所述公有字符映射矩阵的行对应的行编号;其中,所述公有字符映射矩阵中所有相同的行对应同一行编号;
记录所述公有字符映射矩阵的行与所述行编号的对应关系;
将所述公有字符映射矩阵中相同的行进行合并,获得压缩的DFA公有字符映射矩阵。
结合本发明第一方面的第九种可能实现方式,在第一方面的第十种可能实现方式中,所述将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
将所述共同的字符映射矩阵中的与表示自然语言符号的跳转字符对应的列作为所述私有字符映射矩阵的列;
将所述共同的字符映射矩阵中的与表示非自然语言符号的跳转字符对应的列作为所述公有字符映射矩阵的列。
结合本发明第一方面的第九种可能实现方式,在第一方面的第十一种可能实现方式中,所述将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
将所述共同的字符映射矩阵中的第32至第127列组成私有字符映射矩阵;
将所述共同的字符映射矩阵中的第0至第31列以及第128至第255列组成公有字符映射矩阵。
本发明第二方面提供了一种压缩DFA矩阵的装置,包括:
获取单元,用于获取确定的有限状态自动机DFA矩阵;
分组单元,用于将所述获取单元获取到的所述DFA矩阵的行分为若干组;
核单元,用于在所述分组单元将所述DFA矩阵的行分为若干组之后,从分在同一组的行中分别选出每一列上出现次数最多的元素值,获得所述组的核,所述核为将选出的元素值按所属列的顺序排成的行;以及获得所述分在同一组的行中的特别元素值,所述特别元素值为与所述核中对应的元素值不同的所述分在同一组的行中的元素值,所述特别元素值所在的列与所述核中对应的元素值所在的列相同;
记录单元,用于建立第一对应关系和第二对应关系,所述第一对应关系为所述组与所述核的对应关系,所述第二对应关系为所述特别元素值与所述特别元素值所在组、所在行及所在列的对应关系;
存储单元,用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
结合本发明第二方面,在第二方面的第一种可能实现方式中,分组单元,用于将所述获取单元获取到的所述DFA矩阵的行分为若干组,包括:
用于基于聚类算法,将所述DFA矩阵的行分为若干组,使得在同一组中,每一列上的相同元素的数量大于或等于预设值。
结合本发明第二方面的第一种可能实现方式,在第二方面的第二种可能实现方式中,所述分组单元用于基于聚类算法,将DFA矩阵的行分为若干组,包括:
用于:根据DFA矩阵,构造赋权无向完全图;从所述赋权无向完全图的权值中选取一个权值作为阈值;根据所述阈值,将所述赋权无向完全图划分为边权值大于所述阈值的连通子图;将属于同一个连通子图的DFA矩阵的行分为一组。
结合本发明第二方面的第二人种可能实现方式,,在第二方面的第三种可能实现方式中,所述分组单元还用于:在根据DFA矩阵,构造赋权无向完全图之后,将所述赋权无向完全图加入图集合;从所述图集合中选取未划分的赋权无向完全图进行划分;
所述分组单元用于从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:用于从选取的赋权无向完全图的权值中选取一个权值作为阈值。
结合本发明第二方面第三种可能实现方式,在第二方面的第四种可能实现方式中,所述分组单元还用于:在将DFA矩阵的行分为若干组之后,计算第一存储空间和第二存储空间;所述第一存储空间为保存所述若干组所需的存储空间之和,其中每一组所需的存储空间包括每一组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;所述第二存储空间为保存所述DFA矩阵所需的存储空间,其中保存所述DFA矩阵所需的存储空间包括由DFA矩阵的所有行组成的组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;当所述第一存储空间小于所述第二存储空间时,将所述连通子图标记为已划分的图,并加入所述图集合;当所述第一存储空间大于所述第二存储空间时,将所述连通子图加入所述图集合;
所述存储单元用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:用于当所述第一存储空间小于所述第二存储空间时,保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
结合本发明第二方面或第二方面的第一至第四任意一种可能实现方式,在第二方面的第五种可能实现方式中,所述分组单元用于从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:用于从所述赋权无向完全图的权值中选取最小权值作为阈值。
结合本发明第二方面第二至第五任意一种可能实现方式,在第二方面的第六种可能实现方式中,所述赋权无向完全图的权值满足如下公式:
w(ri,rj)=C|hamdist(ri,rj)|
其中,w(ri,rj)表示赋权无向完全图的权值集合,ri表示DFA矩阵中第i行的元素,rj表示DFA矩阵中第j行的元素,i和j表示不同的行数,C表示DFA矩阵中行所包括的元素的个数,hamdist(ri,rj)表示海明距离函数。
结合本发明第二方面或第二方面的第一至第六任意一种可能实现方式,在第二方面的第七种可能实现方式中,所述存储单元用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:
用于将每一组的核组成核矩阵,保存所述核矩阵;将每一组的特别元素值组成特殊跳转表,保存所述特殊跳转表;
所述记录单元还用于:记录每一组的核在核矩阵中的地址,以及记录每一组的特别元素值在所述特殊跳转表中的地址。
结合本发明第二方面或第二方面的第一至第七任意一种可能实现方式,在第二方面的第八种可能实现方式中,所述装置还包括:
编号单元,用于将所述获取单元获取到的DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;其中,所述DFA矩阵中相同的列对应同一列编号;
映射单元,用于根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的编号,建立所述DFA矩阵的字符映射表,所述字符映射表用于表示所述跳转字符与所述列编号的对应关系;
合并单元,用于将所述DFA矩阵中相同的列进行合并,获得合并后的DFA矩阵;
所述分组单元用于将DFA矩阵的行分为若干组,包括:用于将合并后的DFA矩阵的行分为若干组。
结合本发明第二方面的第八种可能实现方式,在第二方面的第九种可能实现方式中,所述获取单元用于获取DFA矩阵,包括:用于获取至少两个DFA矩阵;
所述编号单元用于将所述DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;包括:
用于将所述至少两个DFA矩阵的列进行编号,获得所述至少两个DFA矩阵的列编号;其中,所述至少两个DFA矩阵中所有相同的列对应同一列编号;
所述映射单元用于根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的列编号,建立所述DFA矩阵的字符映射表,包括:
用于根据所述至少两个DFA矩阵的列对应的跳转字符和所述至少两个DFA矩阵的列对应的列编号,建立所述至少两个DFA矩阵的字符映射表;
所述映射单元还用于在建立所述至少两个DFA矩阵的字符映射表之后,将所述至少两个DFA矩阵的字符映射表合并成所述至少两个DFA矩阵对应的共同的字符映射矩阵,其中,所述共同的字符映射矩阵的列对应的跳转字符用ASCII码表示,所述共同的字符映射矩阵的每一行对应所述至少两个DFA矩阵中的一个DFA矩阵;
所述映射单元还用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,所述私有字符映射矩阵由所述共同的字符映射矩阵中的部分列组成,所述公有字符映射矩阵由所述共同的字符映射矩阵中的另一部分列组成;
所述编号单元还用于将所述公有字符映射矩阵的行进行编号,获得所述公有字符映射矩阵的行对应的行编号;其中,所述公有字符映射矩阵中所有相同的行对应同一行编号;
所述记录单元还用于记录所述公有字符映射矩阵的行与所述行编号的对应关系;
合并单元还用于将所述公有字符映射矩阵中相同的行进行合并,获得压缩的DFA公有字符映射矩阵。
结合本发明第二方面的第九种可能实现方式,在第二方面的第十种可能实现方式中,所述映射单元用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
用于:将所述共同的字符映射矩阵中的与表示自然语言符号的跳转字符对应的列作为所述私有字符映射矩阵的列;将所述共同的字符映射矩阵中的与表示非自然语言符号的跳转字符对应的列作为所述公有字符映射矩阵的列。
结合本发明第二方面的第九种可能实现方式,在第二方面的第十一种可能实现方式中,所述映射单元用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
用于:将所述共同的字符映射矩阵中的第32至第127列组成私有字符映射矩阵;将所述共同的字符映射矩阵中的第0至第31列以及第128至第255列组成公有字符映射矩阵。
本发明提供的一种DFA矩阵的压缩方法通过将DFA矩阵进行分组,并从组中获得DFA矩阵的核和特别元素值,并建立第一对应关系,即所述组与所述核的对应关系,以及建立第二对应关系,即所述特别元素值与所述特别元素值所在组、所在行及所在列的对应关系。由于保存DFA矩阵的核、所述特别元素值、所述第一对应关系以及所述第二对应关系所需的存储空间小于保存DFA矩阵的存储空间,因此,本发明方法能够提高DFA矩阵的压缩率。另外,本发明方法不以DFA矩阵的列中具有连续相同状态为压缩DFA矩阵的前提条件,容错率相对较高。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对现有技术和实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是一种DFA矩阵示意图;
图2是另一种DFA矩阵的示意图;
图3是本发明实施例提供的一种DFA矩阵的压缩方法的流程图;
图4是又一种DFA矩阵的示意图;
图5是本发明实施例提供的对DFA矩阵的行进行分组的步骤流程图;
图6是本发明实施例中合并DFA矩阵中相同的列的步骤流程图;
图7是本发明实施例提供的一种DFA跳转表示意图;
图8是本发明实施例提供的一种合并后的DFA矩阵示意图;
图9是本发明实施例提供的一种压缩多个DFA矩阵的步骤流程示意图;
图10是本发明实施例提供的一种多个DFA矩阵的共同的字符映射矩阵示意图;
图11是本发明实施例提供的一种私有字符映射矩阵示意图;
图12是本发明实施例提供的一种公有字符映射矩阵示意图;
图13是本发明实施例提供的一种压缩DFA矩阵的装置示意图;
图14是本发明实施例提供的另一种压缩DFA矩阵的装置示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、详细地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了更好地理解本发明的技术方案,下面结合附图对本发明提供的实施例进行详细地描述。
一般DFA矩阵包括256列,每一列代表一个跳转字符,也即DFA矩阵的列对应跳转字符,跳转字符的宽度为一个字节。图2示出了一种DFA矩阵(图2只示出了部分跳转字符),该DFA矩阵包括起始状态列和7个与跳转字符对应的列(如a、b、c、d、e、f、g跳转字符代表的列)。为了压缩DFA矩阵,减少DFA矩阵所需的存储空间,本发明实施例提供一种DFA矩阵的压缩方法,用于提高DFA矩阵的压缩率。如图3所示,所述方法具体可以包括:
101、获取DFA矩阵。
DFA矩阵的矩阵元素表示相应行表示的状态在输入相应列表示的跳转字符后跳转到的状态。DFA矩阵的列表示输入的跳转字符,DFA矩阵的行表示状态。如图3所示,图3中的DFA矩阵为5列12行的DFA矩阵。
102、将DFA矩阵的行分为若干组。
可以按照DFA矩阵的行的相似度,将相似度高的行分在一组。相似度高的行即具有相同的元素值较多的行。这里的若干组可以是一组,也可以是两组或两组以上。具体的,可以基于聚类算法,将DFA矩阵的行分为若干组,使得在同一组中,每一列上的相同元素的数量大于或等于预设值。这里的预设值可以根据每一组包含的行数进行设定,如预设值可以设定为一个组包含的行数减去预设的数的差值,预设的数可以为1、2或其他数。预设的数越小,预设值越大,同一组内的行的相似度越高。例如,将图4中的DFA矩阵的行分为四组,分别为第0组、第1组、第2组和第3组,预设值为每一组包含的行数减1。具体的,将第0行、第1行、第2行、第3行和第10行分在第0组,第0组包含的行完全相同;将第4行分在第1组,第1组只包括第4行,相当于第1组包含的行完全相同;将第5行、第6行和第8行分在第2组,第2组包含3个行,每一列上相同元素的数量都大于或等于2;将第7行、第9行、第11行和第12行分在第3组,第3组包含4个行,每一列上相同元素的数量都大于或等于3。
103、从分在同一组的行中分别选出每一列上出现次数最多的元素值,获得所述组的核和所述分在同一组的行中的特别元素值。
其中,所述核为将选出的元素值按所属列的顺序排成的行;所述特别元素值为与所述核中对应的元素值不同的所述分在同一组的行中的元素值,所述特别元素值所在的列与所述核中对应的元素值所在的列相同。
以图4中的DFA矩阵为例,在上述分的四个组中,第0组的核即为“3、1、0、2、4”,第0组没有存在特别元素值;第1组的核即为“3、8、7、2、4”即第4行所包含的元素值,第1组也没有存在特别元素值;第2组的核即为“9、6、7、12、10”,由于第2组中的第5行第2列对应的元素值为8与第2组的核中的第2列对应的元素值6不同,因此第2组的特别元素值为8;第3组的核即为“9、11、0、12、10”,由于第3组中的第12行第5列对应的元素值为5与第2组的核中的第5列对应的元素值10不同,因此第3组的特别元素值为5。
104、建立第一对应关系和第二对应关系,所述第一对应关系为所述组与所述核的对应关系,所述第二对应关系为所述特别元素值与所述特别元素值所在组、所在行及所在列的对应关系。
本发明实施例记录每一个组与核的对应关系,以及记录特别元素值与其所在组、所在行及所在列的对应关系。例如,记录上述第2组的特别元素值为8所在的组为第2组,所在的行为第5行,所在的列为第2列;以及记录上述第3组的特别元素值为5所在的组为第3组,所在的行为第12行,所在的列为第5列。简而言之,记录特别元素值8和5分别在DFA矩阵中的位置。
105、保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
应用本发明实施例,上述图4所表示的DFA矩阵只需保存4个组的核、以及特别元素值5、8,以4个组的核与组的对应关系,特别元素值在DFA矩阵中的位置。其中,4个组的核的存储空间只相当于DFA矩阵的4个行的存储空间,其他特别元素值、4个组的核与组的对应关系、特别元素值在DFA矩阵中的位置所占用的空间远小于4个组的核所占用的空间。因此,保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,显然比保存DFA矩阵所需的存储空间小。根据所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,仍然可以还原出所述DFA矩阵。因此,本发明实施例提供的方法能够压缩DFA矩阵,减少存储DFA矩阵所需的存储空间,而且所述方法不以DFA矩阵的列中具有连续相同状态为压缩DFA矩阵的前提条件,容错率相对较高。
在本发明实施例中,步骤102可以通过如下技术措施进一步实现,其具体可以包括:
根据DFA矩阵,构造赋权无向完全图;
从所述赋权无向完全图的权值中选取一个权值作为阈值。
根据所述阈值,将所述赋权无向完全图划分为边权值大于所述阈值的连通子图;将属于同一个连通子图的DFA矩阵的行分为一组。
以下结合图5对DFA矩阵的行的分组做详细说明。
如图5所示,基于层次聚类法,对DFA矩阵的行进行分组。该层次聚类法是一种自顶向下分裂的层次聚类。首先将所有的对象置于一个分组中,对象即指DFA矩阵,然后逐步细分成越来越小的分组,直至达到结束条件,得到所要的分组。应用该层次聚类法实现DFA矩阵分组的具体步骤包括:
201、输入数据集。该数据集即表示DFA矩阵。
202、构造赋权无向完全图G。
具体的,根据输入的数据集,构造赋权无向完全图G所述赋权无向完全图的权值满足如下公式:
w(ri,rj)=C|hamdist(ri,rj)|
其中,w(ri,rj)表示赋权无向完全图的权值集合,ri表示DFA矩阵中第i行的元素,rj表示DFA矩阵中第j行的元素,i和j表示不同的行数,C表示DFA矩阵中行所包括的元素的个数,hamdist(ri,rj)表示海明距离函数。所述阈值可以是所述赋权无向完全图的最小权值。
203、将赋权无向完全图G加入图集合Gs中。其中,图集合Gs初始为空。
204、判断图集合Gs中是否包含未划分的图。
若判断图集合Gs中包含未划分的图,则执行步骤205。
若判断图集合Gs中不包含未划分的图,则执行步骤211。
211、层次聚类结束,输出图集合Gs。此时输出的图集合Gs中的划分的连通子图即表示DFA矩阵的行的分组,保存这些分组的核、特别元素值、这些分组与核的对应关系,以及特别元素值与特别元素值所在组、所在行及所在列的对应关系。
205、选取一个未划分的图Gi。
具体的,从图集合Gs中选取一个未划分的赋权无向完全图进行划分。
206、判断图Gi中是否有未被选中的权值。
若判断图Gi中有未被选中的权值,则执行步骤207;
若判断图Gi中没有未被选中的权值,则返回执行步骤204。
207、从选取的赋权无向完全图的权值中选取最小权值作为阈值。
208、判断所述阈值能否划分图Gi。
若判断所述阈值能够划分图Gi,则执行步骤209;
若判断所述阈值不能够划分图Gi,则返回执行步骤206。
209、根据阈值,将图Gi划分为多个连通子图。该连通子图的边权值大于所述阈值。
在将图Gi划分为多个连通子图之后,也即在将图Gi分为多个组之后,计算第一存储空间和第二存储空间;所述第一存储空间为保存所述多个组所需的存储空间之和,其中每一组所需的存储空间包括每一组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;所述第二存储空间为保存所述DFA矩阵所需的存储空间,其中保存所述DFA矩阵所需的存储空间包括由DFA矩阵的所有行组成的组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间。
当所述第一存储空间小于所述第二存储空间时,将所述连通子图标记为已划分的图,并执行步骤210;当所述第一存储空间大于所述第二存储空间时,也将执行步骤210。
对于第一存储空间和第二存储空间的比较,还可以通过比较每个划分的组的目标函数值之和与图Gi的目标函数值来实现。其中,划分的组的目标函数用于计算保存每个划分的组所需的存储空间,其计算公式可以为:f(G)=cost(G)+C,其中,f(G)表示保存每个划分的组所需的存储空间,C表示划分的组的核所需的存储空间,cost(G)表示分组的存储代价,即用于存储除核以为还需存储的对应关系信息、特别元素值等。图Gi的目标函数值用于计算直接保存图Gi对应的DFA矩阵的所需的存储空间。当划分的组的目标函数值之和小于图Gi的目标函数值时,则将划分得到的子图加入到图集合Gs中,并标记这些子图为为划分图。
210、将划分得到的连通子图加入图集合Gs。
在执行步骤210后,重新返回步骤211。
在上述实施例中,在获得划分的组的核之后,可以将获得的所有核组成核矩阵,保存核矩阵,并记录每一组的核在核矩阵中的地址,从而实现对各组的核的保存;还可以将每一组的特别元素值组成特殊跳转表,保存所述特殊跳转表,并记录每一组的特别元素值在所述特殊跳转表中的地址,以实现每一组的特别元素值的保存。
为了进一步压缩DFA矩阵,本发明实施例还可以采取以下技术措施。
如图6所示,在本实施例中,在获取DFA矩阵之后,所述方法还可以包括:
301、将所述DFA矩阵的列进行编号,获得所述DFA矩阵的列编号。其中,所述DFA矩阵中相同的列对应同一列编号。
302、根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的编号,建立所述DFA矩阵的字符映射表。所述字符映射表用于表示所述跳转字符与所述列编号的对应关系。
303、将所述DFA矩阵中相同的列进行合并,获得合并后的DFA矩阵。
304、将合并后的DFA矩阵的行分为若干组。
例如,根据上述步骤,可以将图2所示的DFA矩阵转换为如图7所示的DFA矩阵的字符映射表,以及如图8所示的合并后的DFA矩阵。在图2所示的DFA矩阵中,跳转字符a、c、g对应的列完全相同,列的元素值分别是0、0、0、4,列对应的列编号为0;跳转字符b、e对应的列完全相同,列的元素值分别是1、4、1、0,列对应的列编号为1;跳转字符d、f对应的列完全相同,列的元素值分别是0、2、0、0,列对应的列编号为2。在图7中,跳转字符a、c、g对应的列编号都为0,跳转字符b、e对应的列编号为1,跳转字符d、f对应的列编号为2,在图8中,合并后的DFA矩阵则由列编号0、1和2对应的列组成。
由于DFA矩阵中的多个相同列只需保存一列,无需重复保存,因此,合并后的DFA矩阵占用的存储空间较小。
当获取多个DFA矩阵时,本发明实施例还可以采取以下进一步技术措施,同时压缩多个DFA矩阵。
如图9所示,压缩多个DFA矩阵的步骤包括:
401、获取至少两个DFA矩阵。
402、将所述至少两个DFA矩阵的列进行编号,获得所述至少两个DFA矩阵的列编号;其中,所述至少两个DFA矩阵中所有相同的列对应同一列编号。
403、根据所述至少两个DFA矩阵的列对应的跳转字符和所述至少两个DFA矩阵的列对应的列编号,建立所述至少两个DFA矩阵的字符映射表。
404、将所述至少两个DFA矩阵中相同的列进行合并,获得合并后的DFA矩阵。每个列编号可以对应合并后的DFA矩阵中的一个列。
405、将所述至少两个DFA矩阵的字符映射表合并成所述至少两个DFA矩阵对应的共同的字符映射矩阵。其中,所述共同的字符映射矩阵的列对应的跳转字符用ASCII码表示,所述共同的字符映射矩阵的每一行对应所述至少两个DFA矩阵中的一个DFA矩阵。
406、将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,所述私有字符映射矩阵由所述共同的字符映射矩阵中的部分列组成,所述公有字符映射矩阵由所述共同的字符映射矩阵中的另一部分列组成。
407、将所述公有字符映射矩阵的行进行编号,获得所述公有字符映射矩阵的行对应的行编号;其中,所述公有字符映射矩阵中所有相同的行对应同一行编号。
408、记录所述公有字符映射矩阵的行与所述行编号的对应关系。
409、将所述公有字符映射矩阵中相同的行进行合并,获得压缩的DFA公有字符映射矩阵。
例如,图10示出的是2001个DFA矩阵对应的共同的字符映射矩阵,其包含2001行256列,其中第0至第第2000行分别对应第0至第2000个DFA矩阵,第0至第255列分别对应第0至第255个跳转字符,矩阵元素是列对应的编号。显然,共同的字符映射矩阵是由2001个DFA矩阵的字符映射表组成,每个字符映射表构成一行。该共同的字符映射矩阵矩阵的第32~127列表示自然语言符号,自然语言符号包括:数字、字母、标点等,将第32~127列组成如图11所示的私有字符映射矩阵,该共同的字符映射矩阵矩阵的第0~第31列及第128~255列表示非自然语言符号,非自然语言符号主要包括控制类语言以及用于保留或传输的二进制数据,将第0~第31列及第128~255列组成如图12所示的公有字符映射矩阵。在将私有字符映射矩阵和公有字符映射矩阵分别存储于媒体的不同位置。由于第0~第31列及第128~255列表示非自然语言符号,绝大多数转换为DFA的正则表达式都没有处理非自然语言符号,其构成的公有字符映射矩阵存在大量相同的行。因此,可以将公有字符映射矩阵中相同的行可以在连续的存储空间进行合并压缩,并记录所述公有字符映射矩阵的行与所述行编号的对应关系,从而减少公有字符映射矩阵所需的存储空间。
如图13所示,本发明实施例还提供一种压缩DFA矩阵的装置,包括:
获取单元501,用于获取确定的有限状态自动机DFA矩阵;
分组单元502,用于将所述获取单元501获取到的所述DFA矩阵的行分为若干组;
核单元503,用于在所述分组单元502将所述DFA矩阵的行分为若干组之后,从分在同一组的行中分别选出每一列上出现次数最多的元素值,获得所述组的核,所述核为将选出的元素值按所属列的顺序排成的行;以及获得所述分在同一组的行中的特别元素值,所述特别元素值为与所述核中对应的元素值不同的所述分在同一组的行中的元素值,所述特别元素值所在的列与所述核中对应的元素值所在的列相同;
记录单元504,用于建立第一对应关系和第二对应关系,所述第一对应关系为所述组与所述核的对应关系,所述第二对应关系为所述特别元素值与所述特别元素值所在组、所在行及所在列的对应关系;
存储单元505,用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
可选的,分组单元502,用于将所述获取单元501获取到的所述DFA矩阵的行分为若干组,包括:
用于基于聚类算法,将所述DFA矩阵的行分为若干组,使得在同一组中,每一列上的相同元素的数量大于或等于预设值。
可选的,所述分组单元502用于基于聚类算法,将DFA矩阵的行分为若干组,包括:
用于:根据DFA矩阵,构造赋权无向完全图;从所述赋权无向完全图的权值中选取一个权值作为阈值;根据所述阈值,将所述赋权无向完全图划分为边权值大于所述阈值的连通子图;将属于同一个连通子图的DFA矩阵的行分为一组。
可选的,所述分组单元502还用于:在根据DFA矩阵,构造赋权无向完全图之后,将所述赋权无向完全图加入图集合;从所述图集合中选取未划分的赋权无向完全图进行划分;
所述分组单元502用于从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:用于从选取的赋权无向完全图的权值中选取一个权值作为阈值。
可选的,所述分组单元502还用于:在将DFA矩阵的行分为若干组之后,计算第一存储空间和第二存储空间;所述第一存储空间为保存所述若干组所需的存储空间之和,其中每一组所需的存储空间包括每一组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;所述第二存储空间为保存所述DFA矩阵所需的存储空间,其中保存所述DFA矩阵所需的存储空间包括由DFA矩阵的所有行组成的组的核、特别元素值、第一对应关系以及第二对应关系所需的存储空间;当所述第一存储空间小于所述第二存储空间时,将所述连通子图标记为已划分的图,并加入所述图集合;当所述第一存储空间大于所述第二存储空间时,将所述连通子图加入所述图集合;
所述存储单元505用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:用于当所述第一存储空间小于所述第二存储空间时,保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系。
可选的,所述分组单元502用于从所述赋权无向完全图的权值中选取一个权值作为阈值,包括:用于从所述赋权无向完全图的权值中选取最小权值作为阈值。
可选的,所述赋权无向完全图的权值满足如下公式:
w(ri,rj)=C|hamdist(ri,rj)|
其中,w(ri,rj)表示赋权无向完全图的权值集合,ri表示DFA矩阵中第i行的元素,rj表示DFA矩阵中第j行的元素,i和j表示不同的行数,C表示DFA矩阵中行所包括的元素的个数,hamdist(ri,rj)表示海明距离函数。
可选的,所述存储单元505用于保存所述核、所述特别元素值、所述第一对应关系以及所述第二对应关系,包括:
用于将每一组的核组成核矩阵,保存所述核矩阵;将每一组的特别元素值组成特殊跳转表,保存所述特殊跳转表;
所述记录单元504还用于:记录每一组的核在核矩阵中的地址,以及记录每一组的特别元素值在所述特殊跳转表中的地址。
如图14所示,所述装置还包括:
编号单元506,用于将所述获取单元501获取到的DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;其中,所述DFA矩阵中相同的列对应同一列编号;
映射单元507,用于根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的编号,建立所述DFA矩阵的字符映射表,所述字符映射表用于表示所述跳转字符与所述列编号的对应关系;
合并单元508,用于将所述DFA矩阵中相同的列进行合并,获得合并后的DFA矩阵;
所述分组单元502用于将DFA矩阵的行分为若干组,包括:用于将合并后的DFA矩阵的行分为若干组。
可选的,所述获取单元501用于获取DFA矩阵,包括:用于获取至少两个DFA矩阵;
所述编号单元506用于将所述DFA矩阵的列进行编号,获得所述DFA矩阵的列编号;包括:
用于将所述至少两个DFA矩阵的列进行编号,获得所述至少两个DFA矩阵的列编号;其中,所述至少两个DFA矩阵中所有相同的列对应同一列编号;
所述映射单元507用于根据所述DFA矩阵的列对应的跳转字符和所述DFA矩阵的列对应的列编号,建立所述DFA矩阵的字符映射表,包括:
用于根据所述至少两个DFA矩阵的列对应的跳转字符和所述至少两个DFA矩阵的列对应的列编号,建立所述至少两个DFA矩阵的字符映射表;
所述映射单元507还用于在建立所述至少两个DFA矩阵的字符映射表之后,将所述至少两个DFA矩阵的字符映射表合并成所述至少两个DFA矩阵对应的共同的字符映射矩阵,其中,所述共同的字符映射矩阵的列对应的跳转字符用ASCII码表示,所述共同的字符映射矩阵的每一行对应所述至少两个DFA矩阵中的一个DFA矩阵;
所述映射单元507还用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,所述私有字符映射矩阵由所述共同的字符映射矩阵中的部分列组成,所述公有字符映射矩阵由所述共同的字符映射矩阵中的另一部分列组成;
所述编号单元506还用于将所述公有字符映射矩阵的行进行编号,获得所述公有字符映射矩阵的行对应的行编号;其中,所述公有字符映射矩阵中所有相同的行对应同一行编号;
所述记录单元504还用于记录所述公有字符映射矩阵的行与所述行编号的对应关系;
合并单元508还用于将所述公有字符映射矩阵中相同的行进行合并,获得压缩的DFA公有字符映射矩阵。
可选的,所述映射单元507用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
用于:将所述共同的字符映射矩阵中的与表示自然语言符号的跳转字符对应的列作为所述私有字符映射矩阵的列;将所述共同的字符映射矩阵中的与表示非自然语言符号的跳转字符对应的列作为所述公有字符映射矩阵的列。
可选的,所述映射单元507用于将所述共同的字符映射矩阵中的列组成私有字符映射矩阵和公有字符映射矩阵,包括:
用于:将所述共同的字符映射矩阵中的第32至第127列组成私有字符映射矩阵;将所述共同的字符映射矩阵中的第0至第31列以及第128至第255列组成公有字符映射矩阵。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程可以通过计算机程序来指令相关的硬件来完成,该程序可存储于计算机可读取存储介质中;该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上对本发明实施例提供的压缩DFA矩阵的方法及相应的装置进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,本说明书内容不应理解为对本发明的限制。