Java資料結構和演算法 字串 陣列和廣義表

2021-07-25 19:40:36 字數 2659 閱讀 9446

陣列和廣義表是與前述的線性表有所區別的資料結構。它們可以看成是線性表在下述含義上的擴充套件:線性表中的元素本身也是乙個資料結構

字串(string)是由n (n≥0) 個字元組成的有限序列。字串簡稱為串,一般記為:

s = 「a0 a1 … an-1」

其中s是串名;用雙引號括起來的字串行是串值;ai (0≤i串中任意多個連續的字元組成的子串行稱為該串的子串。子串在該串中的位置就是子串的首字元在該串中的位置。

如果兩個字串對應位置的字元都相等,且它們長度相等,則稱這兩個字串相等。

在c++中,串值必須用一對雙引號括起來,但雙引號本身不屬於串。而字元用單引號括起來。串「w」和字元『w』是兩個不同的概念,前者是字串,後者是字元。

串是一種線性結構,因此,串既可以用順序儲存結構來儲存,也可以用鍊錶儲存結構來儲存。由於每個字元佔空間很小,只佔8位二進位制,所以串通常採用順序儲存結構儲存,它比用鏈式儲存結構儲存效率高,實現起來也方便。

設有兩個字串ob和pat,若要在串ob中查詢與串pat相等的子串,則稱ob為主串(或稱目標串),pat為模式串,並稱查詢模式串在主串中的匹配位置的運算為模式匹配。

該運算從ob的頭1個字元開始查詢乙個與串pat (稱作模式串) 相同的子串。

如果在串ob中查詢到乙個與模式串pat相同的子串,則函式返回模式串pat的頭乙個字元在串ob中的位置;

如在主串中未查找到乙個與模式串pat相同的子串,則函式返回-1。

在類string中的成員函式find ( )就是模式匹配函式。

brute-forc演算法的主要思想是:從主串ob = 「s0 s1 … sm-1」的第乙個字元開始與模式串pat = 「t0 t1 … tn-1」的第乙個字元比較:

若相等,則繼續比較後續字元;

否則,從主串ob的第二個字元開始重新與模式串pat 的第乙個字元比較。

如此繼續,若在主串ob中有乙個與模式串相等的連續字串行,則匹配成功,函式返回模式串pat的首字元在串ob中的位置;

否則,匹配失敗,函式返回-1。

brute-force演算法是一種帶回溯的演算法,也叫樸素的模式匹配演算法。在最壞情況下,最多要比較m-n+1趟,每趟比較在最後才出現不等,要做n次比較,總比較次數要達到(m-n+1)n。通常n會遠遠小於m,因此,演算法的最壞情況下執行時間為o(m*n)。

kmp演算法是由d.e.knuth、j.h.morris和v.r.pratt三人設計的。該演算法是brute-force演算法的改進。

它消除了brute-force演算法的如下缺點:主串下標i在若干次對應的字元比較相等後,只要有一次對應字元比較不相等便需要回退。

通常,一維陣列a(array)是n (n≥0)個相同資料型別的資料元素a0, a1, , an-1構成的有限線性序列。其中n叫做陣列長度或陣列大小,若n=0就是空陣列。當每乙個陣列元素ai(0≤i≤n-1)本身又是乙個一維陣列時,則a就是乙個二維陣列。類似地,我們可以構成乙個多維陣列,乙個m(m≥2)維陣列中的每乙個陣列元素是乙個m-1維的陣列。

可見在乙個m(m≥2)維陣列中,每乙個陣列元素受m個線性關係的約束,如果乙個元素在每一維中的序號分別為i1、i2、…、im,則稱該元素的下標為:i1、i2、…、im。如果乙個陣列名為a,則ai1i2…im表示下標為i1、i2、…、im的陣列元素。

採用順序儲存結構儲存陣列的元素,就是按某種順序將陣列元素依次存放在記憶體中的一片連續的儲存單元中。

陣列的每個元素的資料型別都相同,因而占有相同的儲存空間。對於一維陣列,相鄰元素的起始位址之差為一常數。

在求解科學和工程計算問題時常常會接觸到「矩陣」這類物件。

矩陣本身就是二維陣列。對於乙個矩陣,如果零元素較多,還是採用上一節所述的儲存方式來儲存的話,就會使得大量的儲存空間存放同乙個值零,從而造成事實上的儲存空間的浪費。

本節,將討論這種矩陣如何進行壓縮儲存,以及基本操作的實現。

像這種零元素非常多的矩陣稱為稀疏矩陣。顯然,關於「稀疏」的定義是無法精確給出的。因為稀疏矩陣是非零元素很少的矩陣,我們只要儲存非零元素就行了。

整個稀疏矩陣的儲存結構既可以採用順序結構儲存,也可以採用鏈式結構儲存。

所有三元組構成了乙個三元組表,該三元組表是乙個線性表。可以採用順序儲存結構儲存的三元組表稱為三元組順序表。在三元組順序表中,矩陣非零元素的三元組按照其在矩陣中的位置,以行優先的順序依次存放,並給出行數、列數和非零元素個數。

當矩陣非零元的位置或個數經常變動時,三元組順序表就不適合於作稀疏矩陣的儲存結構。像作兩個矩陣a與b的加法,把結果儲存到a中,將會引起非零元的的變化,並導致非零元的插入和刪除。此時,採用鏈式儲存結構更好些。

稀疏矩陣的十字鍊錶,由行鍊錶和列鍊錶組成,每乙個矩陣元素既處於行煉表中,又處於列煉表中。這裡的行煉表是乙個不帶表頭結點的單鏈表,列煉表亦是乙個不帶表頭結點的單鏈表。

線性表、棧、佇列、陣列等資料結構都是線性結構,結構中的元素都是同一型別的資料元素。本節所討論的廣義表中元素的資料型別將允許表中元素自身又可以是表。廣義表是線性表的推廣,也有人稱其為列表(lists)。

廣義表ls是由n≥0個表元素α1 ,α2 , … , αn 組成的有限序列,其中表元素αi (1≤i≤n) 或者是乙個資料元素 (可稱為單元素或原子),或者是乙個表(稱為子表)。記作

ls = (α1 ,α2 , … , αn )

其中ls是表名,表的長度為n。長度為0的廣義表為空表。一般用大寫字母表示表名,用小寫字母表示資料元素。如果n≥1,則稱α1 為廣義表ls的表頭(head),稱(α2 , … , αn )為廣義表ls的表尾(tail)。

資料結構和演算法(字串)

字串定義 由零個或多個字元組成的有限序列 字串的比較 一般只比較是否相等 可比大小,比相同位置上的字元的ascii值 字串的儲存結構 順序儲存 陣列 鏈式儲存 鍊錶 bf演算法 brute force,樸素的模式匹配演算法 核心思想 有兩個字串s和t,長度為n和m。首先s 1 和t 1 比較,若相等...

資料結構和演算法 字串

想要研究字串的資料結構和演算法,可以先看一遍字串自帶的一些的屬性和方法 557.反轉字串中的單詞 iii 給定乙個字串,你需要反轉字串中每個單詞的字元順序,同時仍保留空格和單詞的初始順序。示例 輸入 let s take leetcode contest 輸出 s tel ekat edocteel...

資料結構與演算法 字串

判斷乙個串是不是回文串,往往要分開編寫,造成 的拖沓 int longestpalindrome const char s,int n return max void longestpalindrome test 上面的迴圈中,對於回文長度本身的奇偶性,我們進行區別處理。這樣有點拖沓。我們根據乙個簡...