具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供一种基于双向链表的数据筛选方法,旨在解决动态数据集筛选过程中多次对动态变化的大规模数据集进行完整排序或扫描取最大值的操作造成处理效率低、耗时长的缺点,预先按指定长度从全词规则集中提取去重后的最少公共子串集合,并建立各最少公共子串与原始字符串的映射关系,如图1所示,该方法包括以下步骤:
步骤S101,根据所述最少公共子串集合构造出采用连续内存数组存放的数据集,所述数据集中各数据成员为结构体,各所述数据成员中包括计数值、与其他数据成员之间的关联信息、双向链表指针头节点和自身在数组中的索引值。
本实施例中,最少公共子串为划分次数最少的公共子串。在进行步骤S101之前,预先按指定长度从全词规则集中提取最少公共子串集合并去重,指定长度可以为2-4,然后建立各最少公共子串与原始字符串的映射关系。在步骤S101中,根据最少公共子串集合构造出数据集,该数据集采用连续内存数组存放,数据集中各数据成员为结构体。有序排列的同类数据元素的集合称为数组,结构体是由一批数据组合而成的结构型数据。
各数据成员中包括计数值、与其他数据成员之间的关联信息、双向链表指针头节点和自身在数组中的索引值。计数值表征了数据成员映射的原始字符串的条数,计数值为整形数值。
步骤S102,根据各所述计数值将各所述数据成员作为节点划分到预设双向链表指针数组的各个分区。
本实施例中,预先构造预设双向链表指针数组,该预设双向链表指针数组包括多个分区,根据各数据成员计数值将各数据成员作为链表的节点划分到各分区。
为了准确的将数据成员划分到各分区,在本申请一些实施例中,各所述分区带有表征数组深度的下标,根据各所述计数值将各所述数据成员作为节点划分到预设双向链表指针数组的各个分区,具体为:
依次将各所述数据成员作为当前数据成员,并将当前数据成员的当前计数值减一后确定目标下标,并基于目标下标确定目标分区;
若所述目标分区是所述预设双向链表指针数组上最后一个分区,从头遍历所述预设双向链表指针数组并确定第一个小于当前计数值的第三目标节点,将当前数据成员作为节点插入所述第三目标节点之前;
若所述目标分区不是所述预设双向链表指针数组上最后一个分区,基于尾部插入法将当前数据成员作为节点插入;
其中,最后一个分区中各节点的计数值不小于最后一个分区的下标。
本实施例中,预设双向链表指针数组是按照预设数组深度构造的,预设数组深度由数据集的规模确定,该预设数组深度不超过预设深度。每个分区带有表征数组深度的下标,各分区的下标从零开始,该下标加一代表分区中数据成员(也即各节点)的计数值,最后一个分区中各节点的计数值不小于最后一个分区的下标,举例来说,若预设双向链表指针数组的数组深度为128,下标为127的分区中的各节点的计数值不小于127。
在对各数据成员进行划分时,依次将各数据成员作为当前数据成员,并将当前数据成员的当前计数值减一后确定目标下标,并基于目标下标确定目标分区,然后判断目标分区是否为最后一个分区,若是,则基于插入排序法将当前数据成员作为节点插入,也即从头遍历预设双向链表指针数组并确定第一个小于当前计数值的第三目标节点,将当前数据成员作为节点插入第三目标节点之前;若否,则基于尾部插入法将当前数据成员作为节点直接插入。
可选的,预设深度为512。
需要说明的是,以上实施例的方案仅为本申请所提出的一种具体实现方案,其他根据各计数值将各数据成员作为节点划分到预设双向链表指针数组的各个分区的方式均属于本申请的保护范围。
步骤S103,从各所述分区中依次取出第一目标节点,并根据与所述第一目标节点关联的第二目标节点的索引值更新所述预设双向链表指针数组。
本实施例中,第一目标节点为最大计数值所在分区的首个节点,在取出第一目标节点后,将消除对应的原始字符串,与第一目标节点关联的第二目标节点的计数值将发生变化,因此需要更新预设双向链表指针数组。具体的,根据与第一目标节点对应的与其他数据成员之间的关联信息确定关联的第二目标节点,然后根据第二目标节点的索引值(即自身在数组中的索引值)更新预设双向链表指针数组。
可以理解的是,可存在一个或多个与第一目标节点关联的第二目标节点,若第二目标节点为多个,依次根据各第二目标节点的索引值更新所述预设双向链表指针数组。
可以理解的是,若第一目标节点不存在关联的第二目标节点,则取出第一目标节点,不再根据第二目标节点的索引值更新预设双向链表指针数组。
为了准确的更新预设双向链表指针数组,在本申请一些实施例中,根据与所述第一目标节点关联的第二目标节点的索引值更新所述预设双向链表指针数组,具体为:
根据所述第二目标节点的索引值确定所述第二目标节点的计数值;
将所述计数值减一并确定所述第二目标节点的新计数值;
若所述新计数值为零,在所述预设双向链表指针数组中删除所述第二目标节点;
若所述新计数值不为零,根据所述新计数值调整所述第二目标节点在所述预设双向链表指针数组中的位置。
本实施例中,先根据第二目标节点的索引值确定第二目标节点的计数值,然后将该计数值减一,确定第二目标节点的新计数值,判断新计数值是否为零,若为零,则在预设双向链表指针数组中删除第二目标节点;若不为零,则新计数值调整第二目标节点在预设双向链表指针数组中的位置。
需要说明的是,以上实施例的方案仅为本申请所提出的一种具体实现方案,其他根据与第一目标节点关联的第二目标节点的索引值更新预设双向链表指针数组的方式均属于本申请的保护范围。
为了在新计数值不为零时准确调整第二目标节点的位置,在本申请一些实施例中,若所述新计数值不为零,根据所述新计数值调整所述第二目标节点在所述预设双向链表指针数组中的位置,具体为:
若所述第二目标节点处于最后一个分区且存在所述第二目标节点的后继节点,将所述新计数值和所述后继节点的计数值进行比较,并根据比较结果使所述第二目标节点保持不动或与所述后继节点交换位置;
若所述第二目标节点处于最后一个分区且不存在所述后继节点,将所述第二目标节点保持不动或将所述第二目标节点挪动到当前所处分区的前一个分区;
若所述第二目标节点不处于最后一个分区,将所述第二目标节点挪动到当前所处分区的前一个分区。
本实施例中,判断第二目标节点是否处于最后一个分区,若处于最后一个分区,则判断是否存在后继节点,若存在,则将新计数值和后继节点的计数值进行比较,并根据比较结果使第二目标节点保持不动或与后继节点交换位置;若不存在,则将第二目标节点保持不动或将第二目标节点挪动到当前所处分区的前一个分区;若不处于最后一个分区,则将第二目标节点挪动到当前所处分区的前一个分区。
步骤S104,在各所述分区中不存在节点时,确认完成数据筛选。
为了准确的获取筛选结果,在本申请一些实施例中,在确认完成数据筛选之后,所述方法还包括:
将取出的各第一目标节点用结果集数组的形式存储为筛选结果。
通过应用以上技术方案,预先按指定长度从全词规则集中提取去重后的最少公共子串集合,并建立各最少公共子串与原始字符串的映射关系,根据最少公共子串集合构造出采用连续内存数组存放的数据集,数据集中各数据成员为结构体,各数据成员中包括计数值、与其他数据成员之间的关联信息、双向链表指针头节点和自身在数组中的索引值;根据各计数值将各数据成员作为节点划分到预设双向链表指针数组的各个分区;从各分区中依次取出第一目标节点,并根据与第一目标节点关联的第二目标节点的索引值更新预设双向链表指针数组;在各分区中不存在节点时,确认完成数据筛选;其中,第一目标节点为最大计数值所在分区的首个节点,计数值表征了数据成员映射的原始字符串的条数,从而避免了多次重新对数据集的完整排序,提高了对最少公共子串集合的筛选效率。
为了进一步阐述本发明的技术思想,现结合具体的应用场景,对本发明的技术方案进行说明。
本申请实施例提供一种基于双向链表的数据筛选方法,为字符串匹配引擎的预筛引擎提取准备预筛规则数据。预筛引擎输入的是字符串集合的最少公共子串集合,最少公共子串长度可指定,一般指定长度为2-4。本实施例应用于最少公共子串筛选阶段,预先处理拆分出指定长度去重后的最少公共子串集合,并建立每个最少公共子串与其映射的原始字符串之间的映射关系。本实施例将动态数据集进行分区,在数据筛选阶段根据数据变化动态处理,避免了多次重新对数据集的排序。
该方法包括以下步骤:
步骤1,初始化构造数据集,数据集采用连续内存数组存放。数据集中各数据成员为结构体,各数据成员中包括计数值、与其他数据成员之间的关联信息、双向链表指针头节点和自身在数组中的索引值。
步骤2,构造一个双向链表指针数组,用于数据分区排序。双向链表指针数组的数组深度根据数据集的规模设定,一般设在512以下,(分区下标从0开始)分区下标加1代表当前分区所链的数据成员的计数值的大小,最后一个分区中各节点的计数值不小于最后一个分区的下标。
步骤3,数据集数据分区,如图2所示,包括以下步骤:
步骤S201,开始。
步骤S202,遍历数据集中各数据成员并确定当前数据成员的数据结构。
步骤S203,基于当前数据成员的当前计数值查找目标下标并确定目标分区。
具体的,当前计数值减一即为目标下标,基于目标下标确定目标分区。
步骤S204,目标分区是否为最后一个分区,若是执行步骤S205,否则执行步骤S206。
步骤S205,插入排序法插入。
具体的,从头遍历双向链表指针数组并确定第一个小于当前计数值的第三目标节点,将当前数据成员作为节点插入第三目标节点之前。
步骤S206,尾部插入法插入。
具体的,将当前数据成员直接插入。
步骤S207,当前数据成员是否为最后一个数据成员,若是执行步骤S208,否则执行步骤S202。
步骤S208,结束。
步骤4,数据筛选。从各分区中依次取出第一目标节点,将取出的各第一目标节点用结果集数组的形式存储为筛选结果。
步骤5,数据动态变化处理。如图3所示,包括以下步骤:
步骤S301,开始。
步骤S302,取出第一目标节点,确定与第一目标节点关联的第二目标节点的索引值。
步骤S303,根据索引值确定第二目标节点的数据结构。
步骤S304,将数据结构中的计数值减一。
步骤S305,是否计数值=0,若是执行步骤S306,否则执行步骤S307。
步骤S306,删除第二目标节点。
步骤S307,是否在最后一个分区,若是执行步骤S308,否则执行步骤S309。
步骤S308,若存在后继节点,则与后继节点比较后保持不动或交换位置;若不存在后继节点,则保持不动或挪动到前一个分区。
步骤S309,挪动到当前分区的前一分区。
步骤S310,是否是最后一个第二目标节点,若是执行步骤S311,否则执行步骤S302。
步骤S311,结束。
步骤6,重复步骤4,直到双向链表指针数组中各分区中不在有节点,完成数据筛选。
如图4所示为动态数据集和双向链表指针数组映射关系示意图。
通过应用以上技术方案,具有以下有益效果:
(1)仅需要在第一次对数据集的数据成员进行分区时对数据集进行一次遍历,且仅在最后一个分区中进行插入排序,其它区间数据排序复杂度为O(1)。
(2)筛选过程中数据集动态变化,处于最后一个分区的节点数值变化只需与其后继节点比较一次即可确定调整位置,无需对全集进行排序。
(3)索引复杂度为O(1),节点中存储的索引值即为该节点在数组中的下标。
(4)双向量表指针节点从双向链表指针分区迁移,位置调整,删除,只需操作当前节点,复杂度为O(1)。
本申请实施例还提出了一种基于双向链表的数据筛选系统,预先按指定长度从全词规则集中提取去重后的最少公共子串集合,并建立各最少公共子串与原始字符串的映射关系,如图5所示,该系统包括:
构造模块10,用于根据所述最少公共子串集合构造出采用连续内存数组存放的数据集,所述数据集中各数据成员为结构体,各所述数据成员中包括计数值、与其他数据成员之间的关联信息、双向链表指针头节点和自身在数组中的索引值;
划分模块20,用于根据各所述计数值将各所述数据成员作为节点划分到预设双向链表指针数组的各个分区;
筛选模块30,用于从各所述分区中依次取出第一目标节点,并根据与所述第一目标节点关联的第二目标节点的索引值更新所述预设双向链表指针数组;
确认模块40,用于在各所述分区中不存在节点时,确认完成数据筛选;
其中,所述第一目标节点为最大计数值所在分区的首个节点,所述计数值表征了所述数据成员映射的原始字符串的条数。
在具体的应用场景中,各所述分区带有表征数组深度的下标,划分模块20,具体用于:
依次将各所述数据成员作为当前数据成员,并将当前数据成员的当前计数值减一后确定目标下标,并基于目标下标确定目标分区;
若所述目标分区是所述预设双向链表指针数组上最后一个分区,从头遍历所述预设双向链表指针数组并确定第一个小于当前计数值的第三目标节点,将当前数据成员作为节点插入所述第三目标节点之前;
若所述目标分区不是所述预设双向链表指针数组上最后一个分区,基于尾部插入法将当前数据成员作为节点插入;
其中,最后一个分区中各节点的计数值不小于最后一个分区的下标。
在具体的应用场景中,筛选模块30,具体用于:
根据所述第二目标节点的索引值确定所述第二目标节点的计数值;
将所述计数值减一并确定所述第二目标节点的新计数值;
若所述新计数值为零,在所述预设双向链表指针数组中删除所述第二目标节点;
若所述新计数值不为零,根据所述新计数值调整所述第二目标节点在所述预设双向链表指针数组中的位置。
在具体的应用场景中,若所述新计数值不为零,筛选模块30,还具体用于:
若所述第二目标节点处于最后一个分区且存在所述第二目标节点的后继节点,将所述新计数值和所述后继节点的计数值进行比较,并根据比较结果使所述第二目标节点保持不动或与所述后继节点交换位置;
若所述第二目标节点处于最后一个分区且不存在所述后继节点,将所述第二目标节点保持不动或将所述第二目标节点挪动到当前所处分区的前一个分区;
若所述第二目标节点不处于最后一个分区,将所述第二目标节点挪动到当前所处分区的前一个分区。
在具体的应用场景中,所述系统还包括存储模块,用于:
将取出的各第一目标节点用结果集数组的形式存储为筛选结果。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不驱使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。