1. 程式人生 > >要學KMP教程,且暫停,先思考,先思考,再繼續

要學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

 

好像要這樣.

 

=========

考慮一下 自己產生的序列中的數字可能相同的情況.

那時候怎麼判斷,怎麼移動呢?

 

思路對嗎?

不一定對,思考對不對,只有到盡頭才知道.

沒人討論,自己很難思考下去

以後再說吧.自己和自己討論吧.