trie 的应用[连载1]
来源:互联网 发布:手机淘宝在哪注册网店 编辑:程序博客网 时间:2024/05/07 18:24
Trie 想来都是知道的,但将 trie 应用于 php 编程,所见资料却是很少的
先贴代码,以后逐次展开
class TTrie { protected $buffer = array(); protected $dict = array( array() ); protected $input = 0; //字符串当前偏移 protected $backtracking = 0; //字符串回溯位置 public $debug = 0; public $savematch = 1; function set($word, $action='') { if(is_array($word)) { foreach($word as $k=>$v) $this->set($k, $v); return; } $p = count($this->dict); $cur = 0; //当前节点号 foreach(str_split($word) as $c) { if (isset($this->dict[$cur][$c])) { //已存在就下移 $cur = $this->dict[$cur][$c]; continue; } $this->dict[$p]= array(); //创建新节点 $this->dict[$cur][$c] = $p; //在父节点记录子节点号 $cur = $p; //把当前节点设为新插入的 $p++; } $this->dict[$cur]['acc'] = $action; //一个词结束,标记叶子节点 } function match($s) { $ret = array(); $cur = 0; //当前节点,初始为根节点 $i =& $this->input; //字符串当前偏移 $p =& $this->backtracking; //字符串回溯位置 $s .= "\0"; //附加结束符 $len = strlen($s); $buf = ''; while($i < $len) { $c = $s{$i}; if(isset($this->dict[$cur][$c])) { //如果存在 $cur = $this->dict[$cur][$c]; //转到对应的位置 if(isset($this->dict[$cur][$s[$i+1]])) {//检查下一个字符是否也能匹配,长度优先 $i++; continue; } if(isset($this->dict[$cur]['acc'])) { //是叶子节点,单词匹配! if($buf != '') { $this->buffer[] = $buf; $buf = ''; } if($this->savematch) $this->buffer[] = substr($s, $p, $i - $p + 1); //取出匹配位置和匹配的词 $ar = explode(',', $this->dict[$cur]['acc']); call_user_func_array( array($this, array_shift($ar)), $ar ); $p = $i + 1; //设置下一个回溯位置 $cur = 0; //重置当前节点为根节点 } } else { //不匹配 $buf .= $s{$p}; //substr($s, $p, $i - $p + 1); //保存未匹配位置和未匹配的内容 $cur = 0; //重置当前节点为根节点 $i = $p; //把当前偏移设为回溯位置 $p = $i + 1; //设置下一个回溯位置 } $i++; //下一个字符 } if(trim($buf, "\0")) $this->buffer[] = trim($buf, "\0"); } function __call($method, $param) { if($this->debug) printf("偏移:%d 回溯:%d\n", $this->input, $this->backtracking); }}
- trie 的应用[连载1]
- Trie数的应用
- Trie树的应用
- Trie树的简单应用
- poj 3630 初级Trie的应用
- trie树的应用:查找hatword
- 字典树Trie树的应用
- Trie树(前缀树)的应用
- hdu2604(Trie图的应用)
- Trie树的详解及应用
- poj 2418(Trie树的应用)
- TRIE树在输入法分词的应用
- Trie树的建立与简单应用
- Trie树的持久化应用
- POJ4089电话号码--Trie树的应用
- Trie树的详解及其应用
- Trie树的构建和应用
- 《Android应用开发揭秘》连载1
- 第十四章 重载操作符与转换
- 家乡的小河
- 令人敬仰的游戏界十大幕后制作高手
- MFC
- Unity设置Prefab中children的变量
- trie 的应用[连载1]
- ajax里解决缓存问题
- 求数组的子数组之和的最大值
- Android listview分页加载内容
- linux2.6版字符设备的注册与注销
- JS 生成随机数
- Javascript 中 String.replace( ) 多种用法
- 我原来如此
- Linux 下 C 语言编程 GDB 调试