本文结合实例描述了PHP字典树(Trie树)的定义和实现。分享给大家参考,如下:
Trie树的概念(百度的解释):字典树,也叫词搜索树,Trie树是一种树结构,是hash树的变体。典型的应用是对大量的字符串(但不限于字符串)进行统计、排序和保存,因此经常被搜索引擎系统用于文本词频统计。其优点是:利用字符串的公共前缀减少查询时间,尽量减少不必要的字符串比较,查询效率高于哈希树。
我的理解是用于字符串搜索,每个节点只包含一个字符。例如,如果输入单词“world ”,则树结构为:
然后输入单词“worab”,树的结构是:
因此,每个节点还必须有一个字段is_end来标识它是否是一个结束字。例如,如果用户输入wor并搜索以wor开头的所有单词,则假设现在有一个单词wor,并且搜索从“W”开始。检索‘R’时,需要判断‘R’节点的is_end为真,然后将wor添加到结果列表中,然后继续搜索。
PHP实现代码:
?phpclass Node { public $ value//节点值public $ is _ end=false//是否是结束-是否是一个单词public $childNode=array()的结束节点;//子节点/*添加子节点-注意:不需要赋值引用函数,因为PHP对象赋值本身就是引用赋值*/public函数addchildnode ($ value,$ is _ end=false){ $ node=$ this-search childnode($ value);如果(空($node)){ //没有节点,将其添加为子节点$ Node=new Node();$ node-value=$ value;$ this-child node[]=$ node;} $ node-is _ end=$ is _ end;返回$ node}/*查询子节点*/public函数搜索子节点($ value){ foreach($ this-子节点as $ k=$ v){ if($ v-value==$ value){//存在,返回节点return $ this-child node[$ k];} }返回false} }/* add string */function add string($ head,$ str){ $ node=null;for($ I=0;$ I strlen($ str);$i ) { if($str[$i]!=' '){ $is_end=$i!=(strlen($str) - 1)?假:真;if($ I==0){ $ node=$ head-addChildNode($ str[$ I],$ is _ end);} else { $ node=$ node-addChildNode($ str[$ I],$ is _ end);}}}}/*获取所有字符串-递归*/函数获取子字符串($ node,$ str _ array=array(),$ str=' '){ if($ node-is _ end==true){ $ str _ array[]=$ str;} if(空($ node-child node)){ return $ str _ array;} else { foreach($ node-child node as $ k=$ v){ $str_array=getChildString($ v,$str _ array,$ str。$v值);}返回$ str _ array} }/* search */函数搜索字符串($ node,$ str){ for($ I=0;$ I strlen($ str);$i ) { if($str[$i]!=' '){ $ node=$ node-search childnode($ str[$ I]);//print _ r($ node);If(空($node)){ //不存在;返回空返回false} } }返回getChildString($ node);}/*调用测试开始*/$ head=new Node;//树的头部//添加单词addString($head,' hew ol ');addString($head,' hemy ');addString($head,' heml ');addString($head,' you ');addString($head,' yo ');//获取所有单词$ str _ array=getchildstring($ head);//搜索$ search _ array=search string($ head,' hem ');//循环打印所有搜索结果foreach($ search _ arrayas $ key=$ value){ echo ' hem '。$值。br ';//带搜索前缀的输出}更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP数据结构与算法教程》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010
希望本文对PHP编程有所帮助。