要学KMP教程,且暂停,先思考,先思考,再继续

怎么搜索?

怎么可能达到 O(N+M )呢?对比一次还需要M次呢.N次就能确认头部?

aaaabbaaaa

aabaa

思考

N内找M

1,M顺序顺序

2,M抽样,对应位置对比.

如何抽样?

1,3,5这么着随机抽样吧.

或者指定一个序列抽样,为什么不能随机抽样?非要指定呢?

指定相对于随机抽样有什么好处?

抽样或许抽到的都有.另一些没抽到的却没有存在.

指定的难道就不会都有?然后另一半都没?

当然也可能.没区别.首次对比,看不出两种的区别.

 

第一次没找到

然后移动一位,第二次对比的时候,有优势也行啊.那么有什么优势?

除非第一次对比后的结果,对于第二次来说有价值,否则就又跟第一次对比一样,随机跟指定没区别.

 

有个主意,

若 采样时 index是, 1,2  5,6  8,9 这么着,中间间隔随机.而一次2个数字的话.

 

若第一次对比,都对的上,则对比另一半吧.总的对比吧.

 

若第一次对比不对呢?

若是 1和2 都对着呢,而1和2又不相同,那么,就不用对比下一组了.

N的指针移动,1与(之前N中与2相比的数字)对比,是没必要的.跟2相同,就不会跟1相同的,直接N的指针再进一步.

等等,也就是 直接进了两步.那么我的采样,为什么每次都是 上说的那样呢

 

1,2   5,7   11,14

分别间隔0,1,2这样的话,我只需要按上面的原理,就可以直接跳过多个,往后移动指针了.

 

等等

2和5,7和11也有间隙.为什么不也利用上?

 

1,2,4,7,11

这样是一次跳0,1,2,3,4...

先从简单开始,先假设,这些位置的数字都不一样

 

若第一位就错误,直接N的指针挪下一个

若第二位错误,还是需要挪一次,因为1可能跟N的2(以后称为N1,M0)相同.N的第二个数字,和M的第一个数字

 

所以上面的指定序列要改改

(哦,上面1索引开始,下面0索引开始,刚看见)

 

0,2,5,9,14

间隔1,2,3,4

若第二位正确 N2与M2相同

若5不同的时候

挪一次,那样不对,N2可能等于M1呢

还用原来的序列

 

0,1,3,6,10

 

若0相同,对比1,

若0不同,挪动一次1位.

若0同,1不同

一样,挪动一次1位.

 

 

若0,1相同

3相同,则继续

3不同则,直接移动2次

N2与M0对比

 

若到6才不同呢

移动几次?

脑子里想不出来了

做个 示例

 

0 1 X 3 X X 6 X X X 10

0 1 X 3 X X 6 X X X 10

 

数字对着数字则没必要

数字与数字不同是前提

所以直接挪4个

 

6不同则挪7次

上次的数字是多少,就让他加1次

就是需要挪动的距离

 

​X X 10

0 1 X 3 X X 6 X X X 10

 

思路就这个思路

但是序列不对着呢

10的时候,移动7次的话,10跟3对应着呢.没必要的.8次才对,所以序列有问题.

 

如何创造序列,我想象

 

0 1 X 3 X X 6 X X X 10 X X X 14

 

好像要这样.

 

=========

考虑一下 自己产生的序列中的数字可能相同的情况.

那时候怎么判断,怎么移动呢?

 

思路对吗?

不一定对,思考对不对,只有到尽头才知道.

没人讨论,自己很难思考下去

以后再说吧.自己和自己讨论吧.

 

posted @ 2018-11-19 19:25  interim  阅读(166)  评论(0编辑  收藏  举报