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 bufdm_entry_t* dentry; // the dict entry listu_int desize;u_int depos; // the first unused pos in de listu_int* seinfo; // the suffix entry listu_int seisize;u_int seipos;dm_inlemma_t* lmlist; // the lemma listu_int lmsize;u_int lmpos; // the first unused pos in lemma listu_int entrance;}dm_dict_t;//lemma structure for dicttypedef 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指得就是一个模式) 搜索模式匹配