字串小結

2022-07-22 12:09:11 字數 1999 閱讀 5912

string的第乙個內容是hash。這個強有力的優化方式會給解題帶來巨大便利,很可惜的是我並沒有能參透。據我理解,hash實際上就是將待雜湊的資料根據某種規則重新對映的乙個過程,而這個過程往往會大大的降低資料的空間複雜度和訪問所需的時間複雜度。比如以下數列:12,23,34,45,50,我設定乙個雜湊函式f(v)=v/10,那麼最壞情況下需要查詢5此才能找到的50只需要一次[f(50)=50/10=5]即可找到,好的hash確實可以帶來很大的便利,但若是沒有規定出乙個好的雜湊函式,反而會使空間時間增加,這也是我目前無法流暢使用的原因之一。

下乙個內容是trie樹,這個內容還是比較「打腦殼」的,至今我依舊是雲裡霧裡,也許這後幾天學的東西我都存在很多泡沫,需要時間去壓實它們。trie是實現字尾陣列和ac自動機的先決條件之一,

從任何乙個角度來講我都沒有不學好它的理由。其實,trie就是乙個犧牲空間換取時間的演算法,利用字串的公共字首來建樹儲存,使查詢所需的時間複雜度大大降低,低至o(k),此處k為查詢的key串長度。雖然hash理論上是o(1)的時間複雜,但是前文也有提到不是每個雜湊都是好雜湊,而雜湊還會有至少o(k)的計算複雜度,所以trie綜合上來說還是比較優越的。它有一些基本性質譬如根節點不儲存字元、除根節點外任意節點只有乙個字元、從根節點往下遍歷到一葉子節點便是乙個單詞(字串)而且每個節點的子節點包含的字串必須不同,大概就和下圖一樣↓

再下個內容就是kmp演算法了,這也算是string裡為數不多我徹底掌握了的演算法吧,至少是摸清運作原理了,這也歸功於一位大神的blog(因為沒有儲存位址,現在找不到部落格源位址了,文末無法放出連線,非常抱歉)。首先是乙個例題,乙個文字串s和乙個模式串p,如何在s中找到p第一次出現的位置,這就是kmp解決的主要問題。首先可以從暴力入手 :假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則:如果當前字元匹配成功(即s[i] == p[j]),則i++,j++,繼續匹配下乙個字元;如果失配(即s[i]! = p[j]),令i = i - (j - 1),j = 0。相當於每次匹配失敗時,i 回溯,j 被置為0。

思路很清晰,但明顯效率太低,很有可能存在著一種情況:模式串已經有len-1項匹配成功,而且此時位於接近文字串末端的位置,但因為失配,所以會重新返回到起點再來配,若s長到一種程度,這種前功盡棄的情況會使得演算法效率無比底下,而kmp就是實現 「記憶化」匹配:假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),都令i++,j++,繼續匹配下乙個字元;如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),則令 i 不變,j = next[j]。此舉意味著失配時,模式串p相對於文字串s向右移動了j - next [j] 位。換言之,當匹配失敗時,模式串向右移動的位數為:失配字元所在位置 - 失配字元對應的next 值,即移動的實際位數為:j - next[j],且此值大於等於1。而next陣列儲存的是之前字串中有多長的相同字首和字尾,此也意味著在某個字元失配時,該字元對應的next 值會告訴你下一步匹配中,模式串應該跳到哪個位置(跳到next [j] 的位置)。如果next [j] 等於0或-1,則跳到模式串的開頭字元,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某個字元,而不是跳到開頭那樣去傻傻的瘋狂迴圈。

下乙個字串的知識點是ac自動機,同樣,它我也沒有掌握透徹,依舊只能概寫。上文有提到kmp是為了解決單個字串如何快速匹配的問題,而ac自動機解決的便是多字串的匹配問題,也就是說模式串p不再單一。以我之見,kmp處理單個字串的匹配使用的是線性結構的next陣列去解決記憶化的問題,而對於多個模式串而言線性結構似乎顯得太過乏力,於是便只能使用trie字典樹來儲存資料,樹上會存在乙個fail指標來指向跳轉的節點,目前我也就掌握到這,甚至**實現都沒有過,著實是萬分慚愧。

以上內容便是對於字串的總結以及,因為上述內容純手打而且本人學識尚淺,很多演算法理解膚淺,若發現什麼bug,請務必告知我,謝謝。

字串小結

1.字串概念 字串是位於雙引號中的字串行 在記憶體中以 0 結束,所佔位元組比實際多乙個 2.字串的初始化 在c語言中沒有專門的字串變數,通常用乙個字元陣列來存放乙個字串。前面介紹字串常量時,已說明字串總是以 0 作為串的結束符。因此當把乙個字串存入乙個陣列時,也把結束符 0 存入陣列,並以此作為該...

字串小結

1 獲取字串的長度 strlen size t strlen const char str 功能 計算字串的有效長度,不包含0。返回值 返回字串的字元數 strlen 函式計算的是字串的實際長度,遇到第乙個0結束。函式返回值一定是size t,是無符號的整數,即typedef unsigned in...

字串操作小結

上學那會就對字串這塊不甚理解,當時也懶得總結!現在開始工作了,字串操作這塊又被提上日程,於是乎這次一定要稍微寫點東西 string和stringbuffer 找工作那會,這兩個類總是會被提到,無外乎說說他們的區別與用法,其實對於它們本身而言string類是字串常量,是不可更改的常量。而stringb...