要學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
好像要這樣.
=========
考慮一下 自己產生的序列中的數字可能相同的情況.
那時候怎麼判斷,怎麼移動呢?
思路對嗎?
不一定對,思考對不對,只有到盡頭才知道.
沒人討論,自己很難思考下去
以後再說吧.自己和自己討論吧.