【百度分享】dictmatch及多模算法串讲 -- dictmatch基本数据结构及算法

本文介绍了一种基于Trie树的高效字符串匹配算法——dictmatch。该算法通过使用两个表来表示Trie树并优化存储空间,使得在查询时速度极快。文中详细解释了其数据结构特点、建树算法及搜索模式匹配过程。

dictmatch基本数据结构及算法

  dictmatch其实是实现了最简单的Trie树的算法,而且并没有进行穿线改进,因此其是需要回朔的。但是其使用2个表来表示Trie树,并对其占用空间大的问题进行了很大的优化,特点是在建树的时候比较慢,但在查询的时候非常快。而且其使用的hash算法也值得一讲。
字典数据结构:
typedef struct _DM_DICT
{
char* strbuf; // buffer for store word result;
u_int sbsize;
u_int sbpos; // the next position in word buf

dm_entry_t* dentry; // the dict entry list
u_int desize;
u_int depos; // the first unused pos in de list

u_int* seinfo; // the suffix entry list
u_int seisize;
u_int seipos;

dm_inlemma_t* lmlist; // the lemma list
u_int lmsize;
u_int lmpos; // the first unused pos in lemma list

u_int entrance;
}dm_dict_t;

//lemma structure for dict
typedef struct _DM_INLEMMA
{
u_int len;
u_int prop;
u_int bpos;
}dm_inlemma_t;

typedef struct _DM_ENTRY
{
u_int value;
u_int lemma_pos;
u_int suffix_pos;
}dm_entry_t;

其中,dentry可以认为存放树的每个节点,seinfo可以认为存放每个节点的子树的指针列表(即后继块),lmlist存放完成匹配对应的某模式,而strbuf记录所有模式的字符串内容。
每个表的空间都预先开好,以xxxsize为大小。而xxxpos指针之前是已用空间,之后是未使用空间。
seinfo中,每个后继块首字节放的是该后继块的hash表大小,第二个字节指向其属主dentry节点,第三个字节开始是存放子树指针的hash表。因此,每个后继块的大小为hsize+2。
entrance指向了虚根节点所引出的每棵树的指针列表,也就是整个Trie树的入口。

图示:
 
 


此数据结构优点:
结构简单,利于存入和读取二进制文件,节约内存,内存分配次数较少,搜索的时候寻找子节点最快

此数据结构缺点:
不够直观,需要复杂的手动维护,建树时间较长

建树算法:(lemma指得就是一个模式)
 
 
搜索模式匹配
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值