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
树状数组及其拓展
树状数组及其拓展
35 0
|
4天前
|
JavaScript 前端开发 索引
编程技巧:一行代码实现电商评分系统~
编程技巧:一行代码实现电商评分系统~
4 0
|
10月前
|
算法 索引
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析(一)
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析
148 0
|
10月前
|
算法 索引
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析(二)
二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析
73 0
|
11月前
|
机器学习/深度学习 数据可视化 数据挖掘
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
213 0
|
11月前
|
存储 算法
算法总结---最常用的五大算法(算法题思路)
算法总结---最常用的五大算法(算法题思路)
|
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.
|
算法 搜索推荐
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
177 0
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
|
存储 人工智能 搜索推荐
【八大数据排序法】选择排序法的图形理解和案例实现 | C++
排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。
72 0