一种适应于快速数据查找的树形链表及其生成算法制造技术

技术编号:2879686 阅读:443 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种适应于快速数据查找的树形链表及其生成算法,主要通过两个基本操作来实现,即增加关键字的add_key操作和删除一个关键字的del_key操作;反复进行这两个操作可以生成整棵树形链表,由于随着半导体技术的进步,内存等硬件的价格大幅度下降,本发明专利技术通过计算机算法中的“空间换时间”原则,对关键字集合K,构造专用数据链表,从而使得查找速度大大加快,使算法的性能只与N有关,与N是线性关系,而与k和SIZE(p↓[i])无关;匹配算法简单,只需要几条汇编指令就可以完成。(*该技术在2022年保护过期,可自由使用*)

【技术实现步骤摘要】

本专利技术属于计算机信息处理领域,特别涉及一种适应于快速数据查找的树形链表及其生成算法,可以广泛应用于实时性要求高的海量数据查找。
技术介绍
计算机信息查询、规则匹配等大量实际问题都可以转换为多关键字查找问题。许多问题对于实时性要求很高,如网络安全中“防火墙”的规则匹配、入侵检测中的特征匹配、信息过滤中的信息查找、数据挖掘等。这类问题要求在一个特定的数据流,如文件、网络数据包中实时查找特定关键字集合,如“黑客”、“Chinese”、”Microsoft Corporation”等。假设K={k1,k2,...,kn}是一个关键字集合,每个关键字是一个8位组,T=t1,t2,...,tN是一任意输入数据串,要解决的问题就是在T中发现所有ki(1≤i≤n)出现的次数。我们在这里将n称为关键字集合的大小(关键字地个数),SIZE(ki)是关键字ki在计算机内存中存储所占用的字节数。例如,对于匹配内容集合{“黑客”、“Chinese”、”Microsoft Corporation”},n=3,SIZE(“黑客”)=4,SIZE(“Chinese”)=7。现有的算法完成此工作,性能一般受3个因素的影响n的大小。n越大,查找的时间越长;SIZE(ki)的影响。SIZE(ki)越大,查找的时间越长;数据流的长度N。N越大,查找的时间越长。Aho和Corasick最早提供了解决该问题的线性时间算法。其后,与基于单关键字查找的Boyer and Moore算法类似的思想,试图在匹配的同时能够跳过一些文本,Commentz-Walter,Hartel,C.Jason Coit等,Sun Wu都对Aho和Corasick算法进行了改进。的算法和的算法相似。这些方法虽然数据结构相对简单,但是核心匹配部分比较复杂,其执行时间随关键字数量的增加而增加是明显的。
技术实现思路
本专利技术的目的在于克服上述现有技术的缺点,提供了一种通过计算机算法中的“空间换时间”原则,对关键字集合K,构造专用数据链表,使查找速度大大加快的适应于快速数据查找的树形链表及其生成算法。为达到上述目的,本专利技术采用了适应于快速数据查找的树形链表,树形链表是基于有限自动机DFA的,定义如下S(a finite set of states) 匹配过程所处的状态即每一个状态对应一个节点,对一个给定的关键字集P,其最大值是L,状态记录了扫描过程中对各个关键字pi的匹配状况;E(an alphabet)0-255,即表达一个字节的内容;s(initial state)空字符状态,即未读入任何字符状态,空字符状态s∈S;F(finial state)最终状态集,其中每一个元素表示当匹配到某个关键字时所处的状态,FS;g(transition function)S×E->S,读入一个新字符时,状态机状态转移的函数为g(A,a)=B,表示读入a使状态机从状态A转移到状态B;本树形链表实现的关键是找到一个满足定义的g的实现;1)树形链表的构造在DFA的构造中g的设定(1)同一个关键字之内的状态转移设关键字为a1a2a3a4... an;每一个字符定义为DFA树形链表的一个状态,表示对该关键字进行匹配时所处的匹配位置,ai对应的状态称为Ai;则g的定义是g(Ai,ai)=Ai+1在树形链表的DFA中,表现为连接一个关键字各个字符的链,成为树的一个分支;(2)当有两个关键字A和B时的状态转移假设关键字A=a1a2a3...aiai+1ai+2ai+3...ajaj+1...an关键字B=aiai+1...ajb1b2...bm则称关键字B前缀包含于A,即B的前缀aiai+1...ai包含在A中,记为PrefixIn(B,A)=true,或A->B,否则PrefixIn(B,A)=false;PrefixIn是设定“交叉链接”的依据;定义PrefixInStr(B,A)=aiai+1...aj即包含的前缀部分;首先,按同一关键字之内的状态转移确定状态和g,即先确定关键字内的状态转移关系;如果A和B之间没有PrefixIn关系,则g的构造结束;如果两个关键字有PrefixIn关系,设PrefixIn(B,A)=true,且关键字A=a1a2a3...aiai+1ai+2ai+3...ajaj+1...an;关键字B=aiai+1...ajb1b2...bm对应于关键字A的各个状态记为Aa1,Aa2,...Aan;对应于关键字A的各个状态记为Ba1,Ba2,...Baj,Bb1,Bb2,...Bbm;在匹配关键字A的同时也在检查是否同时匹配B,在匹配到状态Aaj的时候,如果读入的下一个字符是b1,则下一状态为Bb1,即应添加g(Aaj,b1)=Bb1在树形链表的DFA结构中,表现为从A的链中指向B的链中的一个“交叉链接”;(3)三个以上关键字A,B,C的情况如果任意两个关键字之间没有PrefixIn关系,按同一个关键字之内的状态转移处理,如果同时最多有两个关键字之间有PrefixIn关系,即仅有小于等于两个PrefixIn关系时,则按两个关键字A和B时的状态转移处理,同时有三个PrefixIn关系的情况,设PrefixIn(B,A)=true,且Prefx(C,A)=true,那么有g(Ax,bz)=Bzg(Ay,cz)=Cz情况1如果Ax≠Ay,则没有冲突情况发生,按两个关键字A和B时的状态转移处理;情况2如果Ax=Ay,且bz≠cz则也不会有冲突情况发生,直接设置g(Ax,bz)=Bz,g(Ax,cz)=Cz即可;情况3如果Ax=Ay,且bz=cz,则会有冲突情况发生,即g(Ax,bz)=Bzg(Ax,bz)=Cz如果有冲突的情况发生,B,C之间必有PrefixIn关系,设PrefixIn(B,C)=true,则去掉g(Ax,bz)=Bz这个链接,保留g(Ax,bz)=Cz。适应于快速数据查找的树形链表的生成算法主要通过两个基本操作来实现,即增加关键字的add_key操作和删除一个关键字的del_key操作;1)Add_key算法节点的数据结构如下struct match_node {struct match_node*ch; //指向下一个状态的256个指针u_int32_t match_id; //当前节点的一个标志号u_int32_t depth;//当前节点在树中的深度struct match_node*parent; //指向当前节点的父节点struct match_node*left_link,*right link;//一个循环链表};首先判断待插入的关键字cur_key是不是已经存在、或与现有的关键字冲突,如有,退出算法;否则,继续;其次按g的同一个关键字之内的状态转移逐个当前加入key各个字符对应的节点,如果该节点已经在树中,处理下一个节点;否则,添加新的节点;新添加的所有节点都要设置相应的parent指针,同时对新增的节点,把它挂到相应的双向链中;如果root->ch被修改,则初始化并设置lev1_nodes,调整所有冗余lev1节点以保持和更新后的root节点一致;按交叉链接设定阶段1检查新添加的cur_key是不是前缀包含于其他key,如本文档来自技高网
...

【技术保护点】
一种适应于快速数据查找的树形链表,其特征在于:树形链表是基于有限自动机DFA的,定义如下:S(a finite set of states):匹配过程所处的状态即每一个状态对应一个节点,对一个给定的关键字集P,其最大值是L,状态记录了扫 描过程中对各个关键字p↓[i]的匹配状况;E(an alphabet):0-255,即表达一个字节的内容;s(initial state):空字符状态,即未读入任何字符状态,空字符状态s∈S;F(finial state):最终 状态集,其中每一个元素表示当匹配到某个关键字时所处的状态,F*S;g(transition function):S×E->S,读入一个新字符时,状态机状态转移的函数为g(A,a)=B,表示读入a使状态机从状态A转移到状态B;本树形链 表实现的关键是找到一个满足定义的g的实现;树形链表的构造在DFA的构造中g的设定:(1)同一个关键字之内的状态转移设关键字为a↓[1]a↓[2]a↓[3]a↓[4]…a↓[n];每一个字符定义为DFA树形链表的一个状态, 表示对该关键字进行匹配时所处的匹配位置,a↓[i]对应的状态称为A↓[i];则g的定义是:g(A↓[i],a↓[i])=A↓[i+1]在树形链表的DFA中,表现为连接一个关键字各个字符的链,成为树的一个分支;(2)当有两个关 键字A和B时的状态转移假设:关键字A=a↓[1]a↓[2]a↓[3]…a↓[i]a↓[i+1]a↓[i+2]a↓[i+3]…a↓[j]a↓[j+1]…a↓[n]关键字B=a↓[i]a↓[i+1]…a↓[j]b↓[1]b↓[2]… b↓[m]则称关键字B前缀包含于A,即B的前缀a↓[i]a↓[i+1]…a↓[j]包含在A中,记为PrefixIn(B,A)=true,或A->B,否则PrefixIn(B,A)=false;PrefixIn是设定“交叉链接”的依据 ;定义PrefixInStr(B,A)=a↓[i]a↓[i+1]…a↓[j]即包含的前缀部分;首先,按同一关键字之内的状态转移确定状态和g,即先确定关键字内的状态转移关系;如果A和B之间没有PrefixIn关系,则g的构造结束; 如果两个关键字有PrefixIn关系,设PrefixIn(B,A)=true,且关键字A=a↓[1]a↓[2]a↓[3]…a↓...

【技术特征摘要】

【专利技术属性】
技术研发人员:李卫管晓宏
申请(专利权)人:西安交通大学
类型:发明
国别省市:87[中国|西安]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术
  • 暂无相关专利