PHP展示KMP拓展算法思想

简介:

每一个算法,都是基于很简单的道理,不断地增加条件,限制,让它符合心意。也就没有其他的东西了。


KMP:

也就是我自己写的一个思路,肯定我讲不清楚,我还没有那么通透,只能记录下我现在的一个思路,而且也没必要测试。

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?php
//基本KMP算法
//看来真的不能解释,本来我还想着解释下一下算法的改进过程发现需要图形示意,算了
//在串S中找串T
//我么为了省事,研究T的特点,每个字符在T中特点,主要是相似程度
//我拿着T去和S比对,肯定有一部分是一样的,突然不一样了,
//问题就是在这个一样的地方,可以节省步骤,“我”代指T中接下来要去匹配的串
//我在T中和相似,你都和S不一样了,我再去比较,不是费事吗,真的是废物了
//怎么标记我在T中的特点,其实就是跳转信息,我想让你略过我的位置,直接过,仅此而已。
//优化只发生在T中的小循环
//这就引入了next数组,记录省事的条状信息。在next几处上发现有点不够完美,还可以更省事
//这就引入了nextVal数组
//结束,哈哈
 
//就是计算出来那个最初的next,来分析T的特征
function  get_next( $string = '' ){
     $i =0;
     $j =0;
     $next = array ();
     $next [1] = 0;
     while ( $i < strlen ( $string )){
         if ( $j ==0 ||  substr ( $string $i ,1)== substr ( $string $j ,1)){
             ++ $i ;
             ++ $j ;
             $next [ $i ]= $j ;
         } else {
             $j = $next [ $j ];
         }
     }
     return  $next ;
}
 
 
//改进,正式的话,上面那个函数就不要看了,只是体现思路
//改进的意思就是大部分一模一样
function  get_nextVal( $string = '' ){
     $i =0;
     $j =0;
     $nextval = array ();
     $nextval [0] = 0;
     while ( $i < strlen ( $string )){
         if ( $j ==0 ||  substr ( $string $i ,1)== substr ( $string $j ,1)){
             ++ $i ;
             ++ $j ;
             if ( substr ( $string $i ,1)!= substr ( $string $j ,1)){
                 $nextval [ $i ]= $j ;
             } else {
                 $nextval [ $i ]= $nextval [ $j ];
             }
         } else {
             $j = $nextval [ $j ];
         }
     }
     return  $nextval ;
}
 
 
funvtion index_KMP($T,$S){
     $i = $pos ;
 
     $j =0;
     $nextVal = array ();
 
     $nextVal =get_nextVal( $T );
     //.....后面先不写了
     while ( $i < strlen ( $S )&&  $j < strlen ( $T ))){
         if ( $j ==0 ||  substr ( $string $i ,1)== substr ( $string $j ,1)){
             ++ $i ;
             ++ $j ;
         } else {
             $j =nextVal[ $j ];
         }
     }
     if ( $j > strlen ( $T )){
         return  $i - strlen ( $T );
     } else {
         return  0;
     }
}

注:这是一个不复杂的思路,人家研究出来的就是很多人都可以理解的。如何运用出去那才是卖油翁的熟能生巧。

注:具体的思路推导,请参考其他大牛写的文档。



本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1949687
相关文章
|
6月前
|
人工智能 BI
树状数组及其拓展
树状数组及其拓展
32 0
|
2月前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
|
9月前
|
搜索推荐 算法 测试技术
八大排序超详解(动图+源码)
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
|
10月前
|
算法 索引
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析(一)
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析
144 0
|
10月前
|
算法 索引
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析(二)
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析
71 0
|
12月前
|
算法
KMP算法细节详解(带动图理解)(2)
KMP算法细节详解(带动图理解)(2)
|
12月前
|
算法
KMP算法细节详解(带动图理解)(1)
前言 KMP算法是为了字符串匹配问题而被研究出来的,字符串匹配问题就是查看一个字符串A是否是字符串B的子串,如果是字串的话,在B的哪个位置?此算法代码简练,但理解起来非常困难,建议挑出一整块时间来专门学习,本文作者写的非常用心,还不了解KMP的小伙伴一定要静下心来慢慢细品,你一定会有所收获🍊 一、字符串匹配问题 如果遇到这种在一个字符串中寻找另一个字符串的子串这种问题,大多数人第一时间想到的肯定是通过暴力匹配算法来完成,也就是Brute-Force算法简称BF算法,时间复杂度为O(m*n),如果有上千行上万文本呢?,时间成本一定会很高,所以D.E.Knuth,J.H.Morris和V.R.
|
12月前
|
存储 算法 搜索推荐
八大排序[超级详细](动图+代码优化)这一篇文章就够了(中)
八大排序[超级详细](动图+代码优化)这一篇文章就够了(中)
71 0
|
12月前
|
搜索推荐 算法
八大排序[超级详细](动图+代码优化)这一篇文章就够了(上)
八大排序[超级详细](动图+代码优化)这一篇文章就够了(上)
56 0
|
12月前
|
存储 搜索推荐 算法
八大排序[超级详细](动图+代码优化)这一篇文章就够了(下)
八大排序[超级详细](动图+代码优化)这一篇文章就够了(下)
59 0

热门文章

最新文章