作者共发了1篇帖子。 内容转换:不转换▼
 
点击 回复
286 0
信号匹配——KMP算法填空
一派护法 十九级
1楼 发表于:2016-5-7 14:13
<?php
class KMP {
    public $da;
    private $an;
    public $pa;
    private $pn;
    
    public function find() {
        $this->an = count($this->da);
        $this->pn = count($this->pa);
        $next = $this->make_next();
        $i = $j = $n = 0;
        
        // 要怪也怪我们眼力不好,两个函数相似度这么高!
        while ($i < $this->an) {
            $n++;
            if ($this->da[$i] == $this->pa[$j] || $j == -1) {
                $i++;
                $j++;
            } else {
                $j = $next[$j];
            }
            
            if ($j == $this->pn) {
                $rst = $i - $this->pn;
                break;
            }
        }
        return $rst;
    }
    
    private function make_next() {
        $next = array(-1);
        $j = 0;
        $k = -1;
        while ($j < $this->pn - 1) {
            if ($k == -1 || $this->pa[$j] == $this->pa[$k]) {
                $j++;
                $k++;
                $next[$j] = $k;
            } else {
                $k = $next[$k]; // 其实从这里已经能看出填空的答案了。。。
            }
        }
        return $next;
    }
    
    public function show() {
        $n = $this->find();
        echo '<b>Result:</b> ', $n, '<br>';
    }
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<?php
$kmp = new KMP();
$kmp->da = array(1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 3);
$kmp->pa = array(1, 2, 1, 1, 2, 1, 1, 1, 2);
$kmp->show();
?>
</body>
</html>

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:286 回复数:0
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-5-7 14:13
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。