C 資料結構與演算法揭秘六

2022-02-09 17:20:10 字數 4571 閱讀 1967

這節我們討論兩種用的蠻多的資料結構——串和陣列

首先,老樣子,什麼是串,這裡串不是吃的牛肉串,羊肉串,而是字串。在應用程式中使用最頻繁的型別是字串。字串簡稱串,是一種特殊的線性表,其特殊性在於串中的資料元素是乙個個的字元。字串在計算機的許多方面應用很廣。如在彙編和高階語言的編譯程式中,源程式和目標程式都是字串資料。在事務處理程式中,顧客的資訊如姓名、位址等及貨物的名稱、產地和規格等,都被作為字串來處理。另外,字串還具有自身的一些特性。因此,把字串作為一種資料結構來研究。具體情況,如圖所示,顧客資訊處理的字串。

串有哪些基本的概念了, 串(string)由 n(n≥0)字元組成的有限序列。一般記為: s=」c1c2…cn」 (n≥0) 其中,s是串名,雙引號作為串的定界符,用雙引號引起來的字串行是串

值。ci(1≤i≤n)可以是字母、數字或其它字元,n為串的長度,當n=0 時,稱為空串(empty string)。 串中任意個連續的字元組成的子串行稱為該串的子串(substring)。包含子串的串相應地稱為主串。子串的第乙個字元在主串中的位置叫子串的位置。如串s1」abcdefg」,它的長度是 7,串s2」cdef」的長度是 4,s2是s1的子串,s2的位置是 3。

如果兩個串的長度相等並且對應位置的字元都相等,則稱這兩個串相等。而在 c#中,比較兩個串是否相等還要看串的語言文化等資訊。所謂語言文化,是指中文的字串和中文字串進行了比較,英文本串與英文本串進行了比較。父串子串的示意圖:

串是如何儲存及類定義的了,由於串中的字元都是連續儲存的,而在 c#中串具有恆定不變的特性,即字串一經建立,就不能將其變長、變短或者改變其中任何的字元。相應的示意圖如下所示:

所以,這裡不討論串的鏈式儲存,也不用介面來表示串的操作。同樣,把串看作是乙個類,類名為 stringds。取名為 stringds 是為了和 c#自身的字串類 string 相區別。類

stringds 只有乙個字段, 即存放串中字串行的陣列 data。 由於串的運算有很多,在類 stringds 中只包含部分基本的運算增加,清空,球長度等等操作。給串類 stringds 的 源**實現如下所示:

public class stringds }

//構造器

public stringds(char arr) }

//構造器

public stringds(stringds s) }

//構造器

public stringds(int len)

//求串長

public int getlength()

求串的長度就是求串中字元的個數,可以通過求陣列 data 的長度來求串的長度。演算法的時間複雜度是o(1),具體情況,如圖所示:

//串比較

public int compare(stringds s) }

if (i <= len)

else if (this[i] > s[i]) }

else if(this.getlength() == s.getlength())

else if (this.getlength() < s.getlength())

return 1;

} 如果兩個串的長度相等並且對應位置的字元相同,則串相等,返回 0;如果串 s 對應位置的字元大於該串的字元或者如果串 s 的長度大於該串, 而在該串的長度返回內二者對應位置的字元相同,則返回-1,該串小於串 s;其餘情況返回1,該串大於串 s。該演算法的時間複雜度是o(n)  涉及到字串陣列的遍歷。具體偽**,如圖所示:

//求子串

public stringds substring(int index, int len) 

stringds s = new stringds(len);

for (int i = 0; i < len; ++i)

return s; }

for(int j = 0; j < s.getlength(); ++j)

return s1;

} 從主串的index位置起找長度為len的子串,若找到,返回該子串,否則,返回乙個空串。涉及字串的遍歷,所以時間複雜度是o(n)  相應圖如圖所示:

//串插入

public stringds insert(int index, stringds s)

for (int i = 0; i < index; ++i)

for(int i = index; i < index + len ; ++i)

for (int i = index + len; i < len2; ++i)

串插入是在乙個串的位置index處插入乙個串s。如果位置符合條件,則該操作返回乙個新串,新串的長度是該串的長度與串s的長度之和,新串的第1部分是該串的開始字元到第index之間的字元,第2部分是串s,第3部分是該串從index位置字元到該串的結束位置處的字元。如果位置不符合條件,則返回乙個空串。時間複雜度是o(n),具體 操作如圖所示:

//串刪除

public stringds delete(int index, int len)

stringds s = new stringds(this.getlength() - len);

for (int i = 0; i < index; ++i)

for (int i = index + len; i < this.getlength(); ++i)

return s;

} 串刪除是從把串的第index位置起連續的len個字元的子串從主串中刪除掉。如果位置和長度符合條件,則該操作返回乙個新串,新串的長度是原串的長度減去len,新串的前部分是原串的開始到第index個位置之間的字元,後部分是原串從第index+len位置到原串結束的字元。如果位置和長度不符合條件,則返回乙個空串。相應的時間複雜度是o(n),相應情況,如圖所示:

這就是我對串的理解,我們看看陣列的理解。

什麼是陣列。所謂陣列是陣列是一種常用的資料結構,可以看作是線性表的推廣。陣列作為一種資料結構, 其特點是結構中的資料元素可以是具有某種結構的資料, 甚至可以是陣列,但屬於同一資料型別。陣列在許多高階語言裡面都被作為固定型別來使用。

陣列是 n(n≥1)個相同資料型別的資料元素的有限序列。一維陣列可以看作是乙個線性表,二維陣列可以看作是「資料元素是一維陣列」的一維陣列,三維陣列可以看作是「資料元素是二維陣列」的一維陣列,依次類推。 圖是乙個 m 行 n 列的二維陣列。

陣列是乙個具有固定格式和數量的資料有序集, 每乙個資料元素通過唯一的下標來標識和訪問。通常,乙個陣列一經定義,每一維的大小及上下界都不能改變。 所以, 在陣列上不能進行插入、 刪除資料元素等操作。 陣列上的操作一般有: 

1、取值操作:給定一組下標,讀其對應的資料元素;演算法的複雜度是o(1) 

2、賦值操作:給定一組下儲或修改與其對應的資料元素; 演算法的複雜度是o(1)

3、清空操作:將陣列中的所有資料元素清除; 演算法的複雜度是o(1)

4、複製操作:將乙個陣列的資料元素賦給另外乙個陣列; 演算法的複雜度是o(n)

5、排序操作:對陣列中的資料元素進行排序,這要求陣列中的資料元素是可排序的;希爾排序,氣泡排序等等,演算法的複雜度是o(n²) 

6、反轉操作:反轉陣列中資料元素的順序。以前提過,請見了c#資料結構與演算法揭秘一。

什麼是陣列的記憶體映象 ,

通常,採用順序儲存結構來儲存陣列中的資料元素,因為陣列中的元素要求連續存放。本質上,計算機的記憶體是乙個一維陣列,記憶體位址就是陣列的下標。所以,對於一維陣列,可根據陣列元素的下標得到它的儲存位址,也可根據下標來訪問一維陣列中的元素。而對於多維陣列,需要把多維的下標表示式轉換成一維的下標表示式。當行列固定後,要用一組連續的儲存單元存放陣列中的元素,有乙個次序約定問題, 這產生了兩種儲存方式: 一種是以行序為主序 (先行後列)的順序存放,另一種是以列序為主序(先列後行)的順序存放。下圖給出了圖中的二維陣列的兩種存放方式示意圖。

這就是我對陣列的理解

資料結構與演算法 揭秘

字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...

C 資料結構與演算法揭秘一

這裡,我們 來說一說c 的資料結構了。什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。程式界有一點很經典的話,程式設計 資料結構 演算法。用源 來體現,資料結構,就是程式設計。他有哪些具體的關係...

C 資料結構與演算法揭秘13

這節,我們來看看一下什麼了,來看看圖的遍歷吧!首先,搞清楚,圖的遍歷的基本的含義了。圖的遍歷是指從圖中的某個頂點出發,按照某種順序訪問圖中的每個頂點,使每個頂點被訪問一次且僅一次。圖的遍歷與樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,並且圖的許多其他操作都是建立在遍歷操作的基礎之上的。遍歷示意...