《大話數(shù)據(jù)結(jié)構(gòu)》學(xué)習(xí)筆記四

第5章 串

串(string)是由零個或多個字符組成的有限序列漠嵌,又名叫字符串募逞。

串的定義

串(string)是由零個或多個字符組成的有限序列鬼譬,又名叫字符串焚鹊。

串的比較

給定兩個串:s= "a1a2……an", t= "b1b2……bm", 當(dāng)滿足以下條件之一時,s<t衡瓶。

  1. n<m徘公,且ai=bi(i=1, 2, ……, n)。
  2. 存在某個k<min(m, n), 使得ai=bi(i=1哮针,2关面,……坦袍,k-1)ak<bk

串的抽象數(shù)據(jù)類型

ADT 串(string)
Data
  串中元素僅由一個字符組成,相鄰元素具有前驅(qū)和后繼關(guān)系缭裆。
Operation
  StrAssign(T,*chars):生成一個其值等于字符串常量chars的串T。
  StrCopy(T,S):串S存在寿烟,由串復(fù)制得串T澈驼。
  ClearString(S):串S存在,將串清空筛武。
  StringEmpty(S):若串為空缝其,返回true,否則返回false徘六。
  StrLength(S):返回串S的元素個數(shù)内边,即串的長度。
  StrCompare(S,T):若S>T待锈,返回值>0,若S=T漠其,返回0,若S<T竿音,返回值<0.
  Concat(T,S1,S2):用T返回由S1和S2聯(lián)接而成的新串和屎。
  SubString(Sub,S,pos,len):串S存在,1<=pos<=StrLength(S)春瞬,且0<=len<=StrLength(S)-pos+1,用Sub返回串S的第pos個字符長度為len的子串柴信。
  Index(S,T,pos):串S和T存在,T是非空串宽气,1<=pos<=StrLength(S)随常。若主串S中存在和串T值相同的子串,則返回它在主串S中第pos個字符之后第一次出現(xiàn)的位置萄涯,否則返回0绪氛。
  Replace(S,T,V):串S、T和V存在涝影,T是非空串钞楼。用V替換主串S中出現(xiàn)的所有與T相等的不重疊的子串。
  StrInsert(S,pos,T):串S和T存在袄琳,1<=pos<=StrLength(S)+1询件。在串S的第pos個字符之前插入串T。
  StrDelete(S,pos,len):串S存在唆樊,1<=pos<=StrLength(S)-len+1宛琅。從串S中刪除第pos個字符起長度為len的子串。
endADT

Index 的實現(xiàn)算法

/* T為非空串逗旁。若主串S中第pos個字符之后存在與T相等的子串嘿辟,則返回第一個這樣的子串在S中的位置舆瘪,否則返回0 */
int Index(String S, String T, int pos)
{
  int n,m,i;
  String sub;
  if (pos > 0)
  {
    n = StrLength(S);
    m = StrLength(T);
    i = pos;
    while ( i <= n-m+1)
    {
      SubString(sub,S,i,m); /* 取主串第i個位置 長度與T相等子串給sub */
      if (StrCompare(sub,T) != 0)  /* 如果兩串不相等 */
        ++i;
      else  /* 如果兩串相等 */
        return i;
    }
  }
  return 0; /* 若無子串與T相等,返回0 */
}

當(dāng)中用到了 StrLength红伦、SubString英古、StrCompare 等基本操作來實現(xiàn)。

串的存儲結(jié)構(gòu)

串的順序存儲結(jié)構(gòu)

串的順序存儲結(jié)構(gòu)是用一組地址連續(xù)的存儲單元來存儲串中的字符序列的昙读。按照預(yù)定義的大小召调,為每個定義的串變量分配一個固定長度的存儲區(qū)。一般使用定長數(shù)組來定義蛮浑。

串的鏈?zhǔn)酱鎯Y(jié)構(gòu)

對于串的鏈?zhǔn)酱鎯Y(jié)構(gòu)唠叛,與線性表是相似的,但由于串結(jié)構(gòu)的特殊性沮稚,結(jié)構(gòu)中的每個元素數(shù)據(jù)是一個字符艺沼,如果也簡單的應(yīng)用鏈表存儲串值,一個結(jié)點對應(yīng)一個字符蕴掏,就會存在很大的空間浪費障般。因此,一個結(jié)點可以存放一個字符盛杰,也可以考慮存放多個字符剩拢,最后一個結(jié)點若是未被占滿時,可以用“#”或其他非串值字符補全饶唤。

串的鏈?zhǔn)酱鎯Y(jié)構(gòu)除了在鏈接串與串操作時有一定方便外徐伐,總的來說不如順序存儲靈活,性能也不如順序存儲結(jié)構(gòu)好募狂。

樸素的模式匹配算法

子串的定位操作通常稱做串的模式匹配办素。
假設(shè)我們要從下面的主串S=“goodgoogle”中,找到T=“google這個子串的位置”祸穷。
簡單的來說性穿,就是對主串的每一個字符作為子串開頭,與要匹配的字符串進行匹配雷滚。對主串做大循環(huán)需曾,每個字符開頭做T的長度的小循環(huán),直到匹配成功或全部遍歷完成為止祈远。
最好的情況呆万,時間復(fù)雜度為O(1)。
稍差一些的情況车份,時間復(fù)雜度為O(n+m)谋减,其中n為主串長度,m為要匹配的子串長度扫沼。
根據(jù)等概率原則出爹,平均是(n+m)/2次查找庄吼,時間復(fù)雜度為O(n+m)。

KMP模式匹配算法

D.E.Knuth严就、J.H.Morris 和 V.R.Pratt 發(fā)表一個模式匹配算法总寻,可以大大避免重復(fù)遍歷的情況,我們把它稱之為克努特-莫里斯-普拉特算法梢为,簡稱 KMP 算法渐行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抖誉,隨后出現(xiàn)的幾起案子殊轴,更是在濱河造成了極大的恐慌衰倦,老刑警劉巖袒炉,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異樊零,居然都是意外死亡我磁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門驻襟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺艰,“玉大人,你說我怎么就攤上這事沉衣∮舾保” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵豌习,是天一觀的道長存谎。 經(jīng)常有香客問我,道長肥隆,這世上最難降的妖魔是什么既荚? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮栋艳,結(jié)果婚禮上恰聘,老公的妹妹穿的比我還像新娘。我一直安慰自己吸占,他們只是感情好晴叨,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矾屯,像睡著了一般篙螟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上问拘,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天遍略,我揣著相機與錄音惧所,去河邊找鬼。 笑死绪杏,一個胖子當(dāng)著我的面吹牛下愈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕾久,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼势似,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僧著?” 一聲冷哼從身側(cè)響起履因,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盹愚,沒想到半個月后栅迄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡皆怕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年毅舆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愈腾。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡憋活,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虱黄,到底是詐尸還是另有隱情悦即,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布橱乱,位于F島的核電站辜梳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仅醇。R本人自食惡果不足惜冗美,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望析二。 院中可真熱鬧粉洼,春花似錦、人聲如沸叶摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛤吓。三九已至宵喂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間会傲,已是汗流浹背锅棕。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工拙泽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸燎。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓顾瞻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親德绿。 傳聞我的和親對象是個殘疾皇子荷荤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容