如何向小學生解釋KMP演算法的原理?

2021-09-08 09:32:42 字數 2691 閱讀 8716

小學生擅長形象思維,用圖畫方式給他們解說比較好。另乙個方面來講,形象思維不就是二維語言麼,比一維的文字語言概括性高點,精確性低點。

先給個具體場景:有個字串「你大爺還是你大爺

現在要在乙個文字中精確查詢是否有這個字串。假設文字很長很長,長得小學生懶得看(老師問:為什麼不寫作業?學生答:懶——得寫。老師:啊?!)

該文字部分內容如下:

天蒼野茫風吹現牛羊你大爺我在尚書房你大爺還是你大爺鄰家小妹在遠方。。。。。。

你大爺還是你大爺

所謂查詢,實際上就是比較。現在要將「你大爺還是你大爺」這作為乙個整體資料在文字中進行查詢。還記得在陣列中查詢指定的某個值查詢方式麼?就是遍歷陣列,依次拿出陣列中的乜咯元素和指定元素進行對比:相等,查詢成功;不等繼續拿出元素對比。

能否將這種思路也遷移到這種字串匹配呢??

當然可以,咱試試。

首先考略下兩者場景的不同點。陣列中找指定元素,指定元素和陣列中單個元素的長度是一致的,都是1,所以每次將比較的游標從陣列當前位置往後挪一位,就可以找到待比較的陣列元素。但是字串匹配中,文字中的元素長度單位還是1,但是指定的字串長度超過了1,在本文中是8.那麼每次比較的時候,游標是否還是向後移動一位呢?

當然是的!因為每移動1位,然後向後擴充套件到長度為8的單元,就可以和指定長度為8的字串進行比較了。所以會發現,在這種字串的匹配中,還是可以類似遍歷的方式來查詢。那麼要查詢多少次呢?

最壞情況就是該字串在文字的末尾,大概就是文字長度的次數了(o(n))

如下圖:指定字串「你大爺還是你大爺」每次移動1個漢字長度,然後和文字內容進行比較。

天蒼野茫風吹現牛羊你大爺我在尚書房你大爺還是你大爺鄰家小妹在遠方。。。。。。

你大爺還是你大爺

天蒼野茫風吹現牛羊你大爺我在尚書房你大爺還是你大爺鄰家小妹在遠方。。。。。。

你大爺還是你大爺

天蒼野茫風吹現牛羊你大爺我在尚書房你大爺還是你大爺鄰家小妹在遠方。。。。。。

你大爺還是你大爺

這樣查詢可以查詢出來,但是有些人覺得這樣遍歷整個文字,這浪費計算資源啊,lowb!

於是乎在減少遍歷次數上做文章。

減少遍歷次數的方式很多,其中kmp(看k毛m片p)演算法給的是其中一種方式,可以減少遍歷次數。

那麼這種演算法具體實現其實是基於被指定物件「你大爺還是你大爺」本身特點來執行的。

第一步,我們用乙個新的視角來觀察這個字串的特點:

看看我們是怎樣來分析這個字串的:

首先將該字串第乙個字串取出來「你」,以該字串中間中間位置為對稱軸,找左右兩邊對稱的字串,然後在這些字串中找到長度最大的一組,並記錄長度。

如上圖所示,一直到當字串增長到完整字串時候「你大爺還是你大爺」,可以發現該字串中間位置在「還」「是」之間的間隔。(1.找對稱位置)

以此為對稱軸找對稱的字串,『「你大爺」和「你大爺」(2.找對稱字串)

數出該字串的長度。「你大爺」.length = 3 ;

將3作為乙個元素存入與「你大爺還是你大爺」等長的陣列中,存放位置就是對應該字串的長度。(3.確定指定字串每一位上對應的對稱最大值)

這樣一來「你大爺還是你大爺」觀察出來了乙個陣列[0,0,0,0,0,0,0,3]

費盡周折觀察這個字串可不是白弄得,這個就是被指定字串移動多少位的依據。

天蒼野茫風吹現牛羊你大爺我在尚書房你大爺還是你大爺鄰家小妹在遠方。。。。。。

你大爺還是你大爺

情觀察上面,野茫茫的「野」與「你」做對比,發現不匹配,那麼要將「你大爺還是你大爺」向後移動,移動多少位呢?這個有個依據,不是最普通每次都定死的移動1位,這個依據就是陣列[0,0,0,0,0,0,0,3]。

怎麼使用這個陣列中數字呢?

很簡單,就是當不匹配這種事情發生在指定字串哪個字元時候,就使用這個字元對應的那個數字。

現在看發生不匹配的發生在字串「你大爺還是你大爺」的第乙個「你」,這個「你」對應數字為0,那麼這個0就是移動依據。移動後達到什麼乙個效果?就是在被指定字串與文字中發生不匹配事件的文字所在位置為標記點,在該點之前所保留的被指定字串的長度為0.

說了這麼多,還是畫圖最直觀:

接下來就是將從「我」開始與「你大爺還是你大爺」進行對比。重複之前的操作,直到匹配出來。

從中可見,第一次出現「你大爺」三個字向符合的位置處,指定字串不像往常那樣只是向後移動一位繼續匹配,而是直接跳了三位來進行匹配。這樣就減少了遍歷次數。

圖示如下:

這種情況的出現一般指定字串和文字中有部分內容重疊時候發生。試想想,如果文字除了最後收尾的字串和指定字串相匹配,前面所有的都不與之有交集,那麼前面的匹配方式依然是每次只移動一位,並沒有減少匹配次數。

指定字串**現了對稱的文字,是kmp演算法能夠減少遍歷次數的關鍵。所以,指定字串中如果沒有出現對稱元素現象,根本沒必要使用,那麼效果和樸素演算法一樣,也是遍歷。

LOL如何拯救小學生

暑假來了,很多人會選擇最近很火的一款遊戲作為娛樂,沒錯,那就是擼啊擼 但是lol裡有一種生物非常影響人們的心情,他們是小學生。他們高喊著 人在塔在 然後劈頭對著對面砍,最後被對面塔打死。有人妄圖勸服他們 別打對方的肉了,打adc!有些小學生會繼續打對面肉盾,然後萌萌的說 什麼叫adc?我們當然沒時間...

課程設計1小學生演算法

問題及 題目描述 利用隨機函式,給小學生出題,100以內的加減乘除 include include 隨機函式的標頭檔案 函式功能 隨機出num道100以內的加減乘除算數題目 輸入引數 a,b 隨機數 c 隨機數 0.1.2.3 代表加減乘除 d 所處題目的正確答案 t 做題人給出的答案 i 用於判斷...

學生託管班 如何給孩子找小學生託管班

現在很多學校中午都沒有食堂給孩子提供午餐,所以家長中午需要開會的接送孩子,我家龍龍去年上小學,從我家去學校步行只需10來分鐘,很方便,每天中午將大寶接回家吃飯。雖然距離不遠,一直來回接送孩子非常麻煩,而且吃飯還必須準點,不然會耽誤孩子上學。他要上學,我要上班,我不忍心讓他爺爺天天跑來跑去的。有天中午...