嚴教演算法
1. 與操作系統有關的一些經典演算法
哦 ,kmp演算法就是一種經典演算法.KMP演算法
一種改進的字元串匹配演算法,由D.E.Knuth與V.R.Pratt和J.H.Morris同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱KMP演算法)。
完全掌握KMP演算法思想
學過數據結構的人,都對KMP演算法印象頗深。尤其是新手,更是難以理解其涵義,搞得一頭霧水。今天我們就來面對它,不將它徹底搞懂,誓不罷休。
如今,大夥基本上都用嚴蔚敏老師的書,那我就以此來講解KMP演算法。(小弟正在備戰考研,為了節省時間,很多課本上的話我都在此省略了,以後一定補上。)
嚴老的《數據結構》79頁講了基本的匹配方法,這是基礎。
80頁在講KMP演算法的開始先舉了個例子,讓我們對KMP的基本思想有了最初的認識。目的在於指出「由此,在整個匹配的過程中,i指針沒有回溯,」。
我們繼續往下看:
現在討論一般情況。
假設 主串:s: 『s(1) s(2) s(3) ……s(n)』 ; 模式串 :p: 『p(1) p(2) p(3)…..p(m)』
現在我們假設 主串第i個字元與模式串的第j(j<=m)個字元『失配』後,主串第i個字元與模式串的第k(k<j)個字元繼續比較
此時,s(i)≠p(j), 有
主串: S(1)…… s(i-j+1)…… s(i-1) s(i) ………….
|| (相配) || ≠(失配)
匹配串: P(1) ……. p(j-1) p(j)
由此,我們得到關系式
『p(1) p(2) p(3)…..p(j-1)』 = 』 s(i-j+1)……s(i-1)』
由於s(i)≠p(j),接下來s(i)將與p(k)繼續比較,則模式串中的前(k-1)個字元的子串必須滿足下列關系式,並且不可能存在 k』>k 滿足下列關系式:(k<j),
『p(1) p(2) p(3)…..p(k-1)』 = 』 s(i-k+1)s(i-k+2)……s(i-1)』
即:
主串: S(1)……s(i-k +1) s(i-k +2) ……s(i-1) s(i) ………….
|| (相配) || || ?(有待比較)
匹配串: P(1) p(2) …… p(k-1) p(k)
現在我們把前面總結的關系綜合一下
有:
S(1)…s(i-j +1)… s(i-k +1) s(i-k +2) …… s(i-1) s(i) ……
|| (相配) || || || ≠(失配)
P(1) ……p(j-k+1) p(j-k+2) ….... p(j-1) p(j)
|| (相配) || || ?(有待比較)
P(1) p(2) ……. p(k-1) p(k)
由上,我們得到關系:
『p(1) p(2) p(3)…..p(k-1)』 = 』 s(j-k+1)s(j-k+2)……s(j-1)』
接下來看「反之,若模式串中存在滿足式(4-4)。。。。。。。」這一段。看完這一段,如果下面的看不懂就不要看了。直接去看那個next函數的源程序。(偽代碼)
K 是和next有關系的,不過在最初看的時候,你不要太追究k到底是多少,至於next值是怎麼求出來的,我教你怎麼學會。
你照著源程序,看著那個例子慢慢的推出它來。看看你做的是不是和課本上正確的next值一樣。
然後找幾道練習題好好練練,一定要做熟練了。現在你的腦子里已經有那個next演算法的初步思想了,再回去看它是怎麼推出來的,如果還看不懂,就繼續做練習,做完練習再看。相信自己!!!
附:
KMP演算法查找串S中含串P的個數count
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;
inline void NEXT(const string& T,vector<int>& next)
{
//按模式串生成vector,next(T.size())
next[0]=-1;
for(int i=1;i<T.size();i++ ){
int j=next[i-1];
while(T!=T[j+1]&& j>=0 )
j=next[j] ; //遞推計算
if(T==T[j+1])next=j+1;
else next=0; //
}
}
inline string::size_type COUNT_KMP(const string& S,
const string& T)
{
//利用模式串T的next函數求T在主串S中的個數count的KMP演算法
//其中T非空,
vector<int> next(T.size());
NEXT(T,next);
string::size_type index,count=0;
for(index=0;index<S.size();++index){
int pos=0;
string::size_type iter=index;
while(pos<T.size() && iter<S.size()){
if(S[iter]==T[pos]){
++iter;++pos;
}
else{
if(pos==0)++iter;
else pos=next[pos-1]+1;
}
}//while end
if(pos==T.size()&&(iter-index)==T.size())++count;
} //for end
return count;
}
int main(int argc, char *argv[])
{
string S="";
string T="ab";
string::size_type count=COUNT_KMP(S,T);
cout<<count<<endl;
system("PAUSE");
return 0;
}
補上個Pascal的KMP演算法源碼
PROGRAM Impl_KMP;
USES
CRT;
CONST
MAX_STRLEN = 255;
VAR
next : array [ 1 .. MAX_STRLEN ] of integer;
str_s, str_t : string;
int_i : integer;
Procere get_nexst( t : string );
Var
j, k : integer;
Begin
j := 1; k := 0;
while j < Length(t) do
begin
if ( k = 0 ) or ( t[j] = t[k] ) then
begin
j := j + 1; k := k + 1;
next[j] := k;
end
else k := next[k];
end;
End;
Function index( s : string; t : string ) : integer;
Var
i, j : integer;
Begin
get_next(t);
index := 0;
i := 1; j := 1;
while ( i <= Length(s) ) and ( j <= Length(t) ) do
begin
if ( j = 0 ) or ( s = t[j] ) then
begin
i := i + 1; j := j + 1;
end
else j := next[j];
if j > Length(t) then index := i - Length(t);
end;
End;
BEGIN
ClrScr;
Write(s = );
Readln(str_s);
Write(t = );
Readln(str_t);
int_i := index( str_s, str_t );
if int_i <> 0 then
begin
Writeln( Found , str_t, in , str_s, at , int_i, . );
end
else
Writeln( Cannot find , str_t, in , str_s, . );
END.
index函數用於模式匹配,t是模式串,s是原串。返回模式串的位置,找不到則返回0
2. 身心嚴教什麼意思
我的理解是,嚴格要求,方正教育。身,指身教,即以身作則,言傳身教的意思;心,指心裡、品性、精神方面,即心性的塑造,理想情操的熏陶培養。嚴教就是從身心兩方面嚴格教育。
3. 三國殺張菖蒲為啥那麼貴
張菖蒲這個武將的出現,可以說是三國殺武將的技能更新的又一次嘗試,把技能的主動權交給了別人,同時還增加了智力在游戲中的重要性:善謀者,得天下。
張昌蒲這個武將非常有意思的一點就是其強度完全由隊友的水平決定,甚至由敵人的水平決定。張昌蒲本人所能控制的也就是回合外留什麼牌,以及對哪個隊友發動【嚴教】。
游戲特色
三國殺作為一款原創桌上游戲,有別於其他桌面游戲的最主要特色,就是身份(勢力、陣營)系統。
身份場中共有4種身份:主公、反賊、忠臣、內奸。主公和忠臣的任務就是剿滅反賊,清除內奸;反賊的任務則是推翻主公。內奸則要在場上先清除除主公以外的其他人物(包括其他內奸),最後單挑主公。
游戲開始時每個玩家隨機抽取一張身份牌,抽到主公的玩家,要將自己的身份牌明示。其他人的身份牌不能被其他玩家看到。
國戰場共有4種勢力:魏、蜀、吳、群和一種特殊身份:野心家。四種勢力的任務是消滅其他勢力的所有角色和所有野心家;野心家與身份場的內奸相似,即必須除掉所以其他人(包括其他野心家),不過無順序要求。
4. 嚴教不如身教,身教不如境教是什麼意思
嚴厲、嚴格的教導,樹立榜樣,以身作則,境,是指孩子生活、成長的環境。
「嚴教不如身教,身教不如境教」的意思是孩子是父母的影子,孩子是父母的翻版。為了培養孩子的品德,做父母親的行為要自慎,應該處處做孩子的表率。孩子好的和壞的行為都是父母教育影響的結果。
家長是孩子的第一任老師,要在孩子的成長過程中,樹立正確的人生觀和價值觀,讓孩子懂得:什麼是是,什麼是非,什麼可為,什麼不可為,讓孩子懂得愛,懂得感恩,懂得給予。
(4)嚴教演算法擴展閱讀:
關於以身作則的幾則話語:
其身正,不令而行;其身不正,雖令而不行。——《論語·子路》
其全句義為:孔子說:「自我品行端正了,即使不發布命令,老百姓也會去實行;若自身不端正,即使發布命令,老百姓也不會服從。」
2.聖人處無為之事行不言之教。——《道德經》
「聖人行不言之教」要求人們,特別是從事教育的人們,要注重以身作則,身教勝於言教,實踐勝於雄辯,同時還要學會因材施教,或言或不言,視學生稟賦而行。
5. 嚴教的利與弊
嚴教的利是孩子很規矩,遵守一切規則,善於忍耐一切不公平和委屈。害處是不能建立和諧的
親子關系
,家長與孩子無法溝通,孩子缺乏自信,沒有闖勁。
6. 考研<<數據結構>>哪些演算法比較重要是不是嚴的那本書上所有的演算法都要掌握!
不是!
★計算機研究生法的考察主要以線性表 +排序(結合)為主 排序(結合)為主 排序(結合)為主 ,其 他知識演算法只要求理解,不會在考研試中出現。之是 他知識演算法只要求理解,不會在考研試中出現。之是 他知識演算法只要求理解,不會在考研試中出現。之是 以線性表 +排序知識為依託,更重要的是考察演算法思想 排序知識為依託,更重要的是考察演算法思想 。你是 。你是 怎樣用線性表 +排序解決問題的,思 想對了才能拿工具做。而排序解決問題的,思 想對了才能拿工具做。而排序解決問題的,思 想對了才能拿工具做。而想的融會貫通則是建 立在對線性表 +排序知識的熟練程度上 。所 以建議多做這方面的工作,在熟練掌握線性表 以建議多做這方面的工作,在熟練掌握線性表 +排序知識的基礎 上,多鍛煉演算法的思想。
★數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 數據結構:小題目理 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 解知識最重要;大題目圖 /查找 和演算法, 演算法最重要。中,思想只正確程 演算法最重要。中,思想只正確程 演算法最重要。中,思想只正確程 演算法最重要。中,思想只正確程 演算法最重要。中,思想只正確程 序寫,基本上就能得到 一半以的分數。當然在考場想序寫,基本上就能得到 一半以的分數。當然在考場想序寫,基本上就能得到 一半以的分數。當然在考場想的方法 就是最好, 時間復雜度和空能最優好不能就寫想到的 。所以 。所以 數據結構的 復習,最重要是演算法思想數據結構的 復習,最重要是演算法思想訓
7. 嚴教苛求的意思
嚴教,指嚴格教誨。
苛求,拼音是kē qiú,意思是過嚴地要求。
8. 計算教學中如何正確處理算理和演算法的關系
計算的算理是指計算的理論依據,通俗地講就是計算的道理。算理一般由數學概念、定律、性質等構成,用來說明計算過程的合理性和科學性。計算的演算法是計算的基本程序或方法,是算理指導下的一些人為規定,用來說明計算過程中的規則和邏輯順序。
算理和演算法既有聯系,又有區別。算理是客觀存在的規律,主要回答「為什麼這樣算」的問題;演算法是人為規定的操作方法,主要解決「怎樣計算」的問題。算理是計算的依據,是演算法的基礎,而演算法則是依據算理提煉出來的計算方法和規則,它是算理的具體體現。算理為計算提供了正確的思維方式,保證了計算的合理性和可行性;演算法為計算提供了便捷的操作程序和方法,保證了計算的正確性和快速性。算理和演算法是計算教學中相輔相成、缺一不可的兩個方面。
處理好算理與演算法的關系對於突出計算教學核心,抓住計算教學關鍵具有重要的作用。當前,計算教學中「走極端」的現象實質上是沒有正確處理好算理與演算法之間關系的結果。一些教師受傳統教學思想、教學方法的支配,計算教學只注重計算結果和計算速度,一味強化演算法演練,忽視算理的推導,教學方式「以練代想」,學生「知其然,不知其所以然」,導致教學偏向「重演算法、輕算理」的極端。與此相反,一些教師片面理解了新課程理念和新教材,他們把過多的時間用在形式化的情境創設、動手操作、自主探索、合作交流上,在理解算理上大做文章,過分強調為什麼這樣算,還可以怎樣算,卻缺少對演算法的提煉與鞏固,造成學生理解算理過繁,掌握演算法過軟,形成技能過難,教學走向「重算理、輕演算法」的另一極端。
如何正確處理算理與演算法的關系,防止「走極端」的現象,廣大數學教師在教學實踐中進行了有益的探索,取得了許多成功經驗。比如,「計算教學要尋求算理與演算法的平衡,使計算教學『既重算理,又重演算法」「把算理與演算法有機融合,避免算理與演算法的『硬性對接』」「引導學生在理解算理的基礎上自主地生成演算法,在演算法形成與鞏固的過程中進一步明晰算理」「計算教學要讓學生探究並領悟算理,及時抽象並掌握演算法,力求形成技能並學會運用」等等,這些觀點對於計算教學少走彎路、提高計算教學質量具有重要作用。
對此,筆者認為,處理計算教學中算理與演算法的關系還應注意以下五點:一是算理與演算法是計算教學中有機統一的整體,形式上可分,實質上不可分,重演算法必須重算理,重算理也要重演算法;二是計算教學的問題情境既為引出新知服務,體現「學以致用」,也為理解算理、提煉演算法服務,教學要注意在「學用結合」的基礎上,以理解算理,掌握演算法,形成技能為主;三是算理教學需藉助直觀,引導學生經歷自主探索、充分感悟的過程,但要把握好演算法提煉的時機和教學的「度」,為演算法形成與鞏固提供必要的練習保證;四是演算法形成不能依賴形式上的模仿,而要依靠算理的透徹理解,只有在真正理解算理的基礎上掌握演算法、形成計算技能,才能算是找到了算理與演算法的平衡點;五是要防止算理與演算法之間出現斷痕或硬性對接,要充分利用例題或「試一試」中的「可以怎樣算?」「在小組里說一說,計算時要注意什麼?」等問題,指導學生提煉演算法,為算理與演算法的有效銜接服務。
9. 數據結構與演算法分析榮政和嚴蔚敏版區別
嚴書我有系統地學習過,Mark Allen的書也粗略地讀過一些。
這兩本書雖然都是數據結構的教科書,但面向的讀者類型並不一樣。嚴書通常面向的讀者是低年級的本科生,而Mark Allen的書面向的是高年級本科生和研究生。Mark Allen在前言部分也明確地說了這是一本進階的數據結構教材。
嚴書基本上是國內使用最為廣泛的數據結構教材,也是考研408的官方指定用書。嚴書全篇的邏輯體系非常清楚,國內出版的其他數據結構的書也都或多或少有嚴書的影子。它的內容組織是從數據結構的視角開展的。從邏輯結構的角度來看,全書是按從線性結構到非線性結構的思路來進行介紹的。在每一章的具體數據結構的實例里,又按物理結構從數組實現到鏈表實現來展開,從中穿插少量的演算法復雜度分析等理論分析內容。嚴書把具有明顯演算法色彩的搜索主題和排序主題單獨成章,放在了書的末尾幾章,把讀者從數據結構角度的視角引領到演算法角度的視角,為後續進階的演算法課程做鋪墊,這在內容編排上是很科學的。
數據結構和演算法二者實際上是密不可分的。演算法可以看作是定義在特定數據結構上的操作的序列,許多演算法實際上是依託於數據結構的設計才能得以實現的。有不少教材不將二者分開,是將數據結構與演算法同時講述,Mark Allen的這本書就是非常經典的一本。
Mark Allen這本書在數據結構和演算法兩個角度上同時進行講述。數據結構的部分不如嚴書講得細致,但關鍵的要點都勾畫出來了,代碼部分也需要讀者進行自行補充。對於高年級本科生和研究生來說,具體的實現不是什麼困難的事情,Mark的這種處理方式容易使重點突出,這也是全書內容詳實但篇幅不大的原因。Mark Allen這本書在演算法部分涉及較為深入,有詳細的理論推導和復雜度證明,課後習題里也有一定難度的演算法題和演算法分析題。除此之外,Mark Allen這本書還涉及到復雜的數據結構,例如左式堆、二項隊列、紅黑樹、斐波那契堆等,這些內容在嚴書這種面向低年級本科生的教材里基本上是不提及的
10. 如何提高演算法
計算的准確性不但在「應試教育」中佔主要地位,在「素質教育」的今天同樣重要。因為式子題的計算是學生解決實際問題的基礎,是每個小學生必須掌握的數學基礎知識和基本技能。只有計算過硬,才能進一步學好應用題和其他學科知識。式子題計算是各年級的重要內容,根據學生的考試和作業看,造成成績不理想的原因是計算能力差,准確率不高。造成這種現象的原因是多方面的:首先是低年級忽略了口算訓練,其次是在各年級中輕視了式子題的教學,誤認為計算式子題只要弄清計算順序,便能算出來,這種想法造成學生計算不細心,准確率低,從而缺乏攻克復雜式子題的興趣和信心。
計算準確,要從低年級抓起,不僅要教學生演算法,更要重視口算的訓練。口算是筆算、估算的基礎,只有讓學生在理解的基礎上掌握了口算的方法,堅持練習,逐步達到熟練的程度,才會在中、高年級中熟練、准確地計算。同樣,中高年級也不能忽視口算的練習。
式子題的訓練,還要從讀題做起,讀題要求學生正確規范,這樣有助於弄清運算順序。有括弧題,如(a+b)c,可讀作a與b的和乘以c,不能把括弧讀出來,嚴格要求學生讀准,從中悟出運算順序,確定自己的演算法。弄清計算順序是計算的前期。不這樣訓練,學生容易忽略和弄錯順序,對「准確」沒有把握,長期這樣,學生會對數學失去信心,失去積極性,教師也會對學生的計算失去信心。
文字題是式子題的讀題與列式計算的訓練,在讀題的基礎上,讓學生列出算式,正反結合訓練,會對學生的計算進行強化。文字題既然是計算題的敘述,那麼解決文字題就是列出綜合算式,它與應用題的解答有別,不能用分步計算,但可以用分步式分析。分析後列出綜合計算是解決文字題的正確做法。
加強運算定律和運算性質的教學,多用於實際計算,讓學生充分理解算理,掌握法則,鼓勵學生運用簡便演算法。除題目要求簡算外,教師要有意識地要求學生能簡算的奧運用簡算,提高學生的簡算興趣,使簡算貫穿於一切計算之中,逐步摸索計算的技巧,做到計算合理,靈活,准確,迅速,有力的提高學生的計算能力。
計算準確性的訓練要常抓不懈,養成檢查、驗算的習慣。對於一般的學生,式子題做完了不願意檢查、驗算,造成准確率低的現象。針對這種現象,要有意識的訓練,培養學生驗算,長此以往,「准確」就有保證了。
在式子題的計算中,採用適當的計算方法也要給與指導和練習。如高年級的分數、小數、百分數的混合運算,要根據題和自己的特長確定具體演算法。讓學生針對題型動腦思考,自做練習,在和他人比較,找到巧妙的演算法,也是准確性的訓練。
對學生經過長期多方面的計算訓練,培養學生嚴格、認真、對計算結果負責的良好習慣以及有毅力、肯動腦、克服困難的意志,學生的計算能力就會明顯提高,為下一步學習打下堅實基礎