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

2021-09-23 21:17:05 字數 4911 閱讀 4831

上文對資料結構與演算法,有了乙個簡單的概述與介紹,這篇文章,我們介紹一中典型資料結構——線性結構。

什麼是線性結構,線性結構是最簡單、最基本、最常用的資料結構。線性表是線性結構的抽象(abstract), 線性結構的特點是結構中的資料元素之間存在一對一的線性關係。 這

種一對一的關係指的是資料元素之間的位置關係,即: (1)除第乙個位置的資料元素外,其它資料元素位置的前面都只有乙個資料元素; (2)除最後乙個位置的資料元素外,其它資料元素位置的後面都只有乙個元素。也就是說,資料元素是乙個接乙個的排列。因此,可以把線性結構想象為一種資料元素序列的資料結構。

線性結構(list)是由 n(n≥0)個相同型別的資料元素構成的有限序列。對於這個定義應該注意兩個概念:一是「有限」 ,指的是線性表中的資料元素的個數是有限的,線性表中的每乙個資料元素都有自己的位置(position)。本書不討論資料元素個數無限的線性表。二是「相同型別」 ,指的是線性表中的資料元素都屬於同一種型別。這體現在我們常用的資料結構就是陣列,泛型等等他們都是線性結構的。

他們之間的關係 是:線性表的形式化定義為:線性表(list)簡記為 l,是乙個二元組, l = (d, r) 其中:d 是資料元素的有限集合。 r 是資料元素之間關係的有限集合。

線性結構的基本操作如下:

這裡為什麼是ilistds是與。net自帶ilist相區別。對每個方法解釋如下:

先看最簡單的線性結構——順序表

什麼是順序表,線性結構的順序儲存是指在記憶體中用一塊位址連續的空間依次存放線性表的資料元素,用這種方式儲存的線性就叫順序表(sequence list)。

順序表儲存結構如圖所示

假設順序表中的每個資料元素佔w個儲存單元, 設第i個資料元素的儲存位址為loc(ai),則有: loc(ai)= loc(a1)+(i-1)*w 1≤i≤n 式中的loc(a1)表示第乙個資料元素a1的儲存位址,也是順序表的起始儲存位址,稱為順序表的基位址(base address). 這裡我們舉個例子吧,比如你去酒店的時候,知道101號房間的基準的位置,你要去111號房間,你知道每個房間之間的距離是5,那裡只需要前進50公尺。順序表的位址運算就這麼簡單。

而順序表是繼承與線性結構,他的源**又是這個樣子的。

public class seqlist: ilistds

set }

//最後乙個資料元素位置屬性

public int last }

//容量屬性

public int maxsize

set }

//構造器 進行函式初始化工作

public seqlist(int size) 

//求順序表的長度

public int getlength()

//清空順序表

//清除順序表中的資料元素是使順序表為空,此時,last 等於-1。

public void clear()

//判斷順序表是否為空

//如果順序表的 last 為-1,則順序表為空,返回 true,否則返回 false。

public bool isempty()

else }

//判斷順序表是否為滿

//如果順序表為滿,last 等於 maxsize-1,則返回 true,否則返回 false。

public bool isfull()

else }

//附加操作是在順序表未滿的情況下,在表的末端新增乙個新元素,然後使順序表的last加1。

//(1)判斷順序表是否已滿和插入的位置是否正確,表滿或插入的位置不正確不能插入;

//(2)如果表未滿和插入的位置正確,則將an~ai依次向後移動,為新的資料元素空出位置。在演算法中用迴圈來實現;

//(3)將新的資料元素插入到空出的第 i 個位置上;

//(4)修改 last(相當於修改表長) ,使它仍指向順序表的最後乙個資料元素。

//在順序表的第i個資料元素的位置插入乙個資料元素

public void insert(t item, int i)

if(i<1 | i>last+2)

if (i == last + 2)

else

data[i-1] = item;

} ++last;

} 演算法的時間複雜度分析:順序表上的插入操作,時間主要消耗在資料的移動上, 在第i個位置插入乙個元素, 從ai到an都要向後移動乙個位置, 共需要移動n-i+1

個元素,而i的取值範圍為 1≤i≤n+1,當i等於 1 時,需要移動的元素個數最多,為n個;當i為n+1 時,不需要移動元素。設在第i個位置做插入的概率為pi,則平

均移動資料元素的次數為n/2。這說明:在順序表上做插入操作平均需要移動表中一半的資料元素,所以,插入操作的時間複雜度為o(n) 。

//順序表的刪除操作是指將表中第i個資料元素從順序表中刪除, 刪除後使原表長 為 n 的 表 (a1,a2, … ,ai-1,ai, ai+1, … ,an) 變 為 表 長 為 n-1的 表(a1,a2,…,ai-1,ai+1,…,an)。i的取值範圍為 1≤i≤n,i為n時,表示刪除順序表末尾的資料元素。 

順序表上刪除乙個資料元素的步驟如下:

(1)判斷順序表是否為空和刪除的位置是否正確,表空或刪除的位置不正

確不能刪除;

(2)如果表未空和刪除的位置正確,則將ai+1~an依次向前移動。在演算法中

用迴圈來實現;

(3)修改 last(相當於修改表長) ,使它仍指向順序表的最後乙個元素。

//刪除順序表的第i個資料元素

public t delete(int i)

if (i < 1 | i > last+1)

if (i == last+1)

else }

--last;

return tmp;

} 演算法的時間複雜度分析:順序表上的刪除操作與插入操作一樣,時間主要消耗在資料的移動上。在第i個位置刪除乙個元素,從ai+1到an都要向前移動乙個位置,共需要移動n-i個元素,而i的取值範圍為 1≤i≤n,當i等於 1 時,需要移動的元素個數最多,為n-1 個;當i為n時,不需要移動元素。設在第i個位置做刪除的概率為pi,則平均移動資料元素的次數為(n-1)/2。這說明在順序表上做刪除操作平均需要移動表中一半的資料元素,所以,刪除操作的時間複雜度為o(n) 。

//取表元運算是返回順序表中第 i 個資料元素,i 的取值範圍是 1≤i≤last+1。由於表是隨機訪問的,所以,如果 i 的取值正確,則取表元運算的時間複雜度為o(1) 。

//獲得順序表的第i個資料元素 

public t getelem(int i)

return data[i-1];

} //順序表中的按值查詢是指在表中查詢滿足給定值的資料元素。 在順序表中完成該運算最簡單的方法是:從第乙個元素起依次與給定值比較,如果找到,則返回在順序表中首次出現與給定值相等的資料元素的序號,稱為查詢成功;否則,在順序表中沒有與給定值匹配的資料元素,返回乙個特殊值表示查詢失敗。

//在順序表中查詢值為value的資料元素

public int locate(t value)

int i = 0;

for (i = 0; i <= last; ++i) }

if (i > last)

return i; } }

演算法的時間複雜度分析:順序表中的按值查詢的主要運算是比較,比較的次數與給定值在表中的位置和表長有關。當給定值與第乙個資料元素相等時,比較次數為 1;而當給定值與最後乙個元素相等時,比較次數為 n。所以,平均比較次數為(n+1)/2,時間複雜度為 o(n) 。

如:已知順序表 l,寫一演算法將其倒置,即實現如圖 2.4 所示的操作,其中(a)為倒置前,(b)為倒置後。

我思考的思路就是以所在的中間數進行前後調換。相應的源**如下:

public void reversseqlist(seqlistl) }

該演算法只是對順序表中的資料元素順序掃瞄一遍即完成了倒置, 所以時間複雜度為 o(n)。其中執行效果如圖所示:

還譬如,我就我開發親身經歷而言  在俄羅斯方塊這個專案中,我的順序結構用的確實很多譬如初始化過程中。

// 初始化形狀集合,共七種形狀

_pieces = new list;

// 初始化方塊容器(用 block 物件填滿整個容器)

container = new block[_rows, _columns];

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

}// 初始化下乙個形狀的容器(用 block 物件將其填滿)

nextcontainer = new block[4, 4];

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

}// 建立乙個新的形狀

createpiece();

// 呈現當前建立出的形狀

addpiece(0, 0);

// timer 用於定時向下移動形狀

_timer = new dispatchertimer();

_timer.interval = timespan.frommilliseconds(_initspeed);

_timer.tick += _timer_tick;

gamestatus = gamestatus.ready;

你看看我用的初始化方塊容器,這個容器是二維陣列,這就是一種明顯的順序表。將他top位置,left位置賦值,進行一系列初始化工作。這就等同於順序表初始化操作。這個演算法的複雜度為o(n²)。

本文中,我們討論了什麼是線性結構,線性結構有哪些特點,並且詳細介紹了乙個最簡單線性結構順序表,並且通過源**對她進行一些列的分析,最後還舉了兩個例子,讓我們更好的理解順序表。

資料結構與演算法 揭秘

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

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

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

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

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