常用的資料結構及對應演算法

2022-07-01 18:15:11 字數 4234 閱讀 9275

一:常見的資料結構及演算法

1.線性表及其演算法

1.1 線性表

線性表是最基本、最簡單、也是最常用的一種資料結構。線性表(linear list)是資料結構的一種,乙個線性表是n個具有相同特性的資料元素的有限序列。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的

1.2 線性表的常見演算法

刪掉線性表中的相同元素,並且按公升序排列

linklist deletesameelem(linklist &l)

else

}return l;

}

2.棧及其演算法

2.1 棧

棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

2.2 棧的常見演算法

2.2.1 入棧

void pushstack(char x)  //

入棧

2.2.2 出棧

char popstack()

else

}

3.佇列及其演算法

3.1 佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

順序佇列中的溢位現象:

① "下溢"現象:當隊列為空時,做出隊運算產生的溢位現象。「下溢」是正常現象,常用作程式控制轉移的條件。

②"真上溢"現象:當佇列滿時,做進棧運算產生空間溢位的現象。「真上溢」是一種出錯狀態,應設法避免。

③"假上溢"現象:由於入隊和出隊操作中,頭尾指標只增加不減小,致使被刪元素的空間永遠無法重新利用。當佇列中實際的元素個數遠遠小於向量空間的規模時,也可能由於尾指標已超越向量空間的上界而

不能做入隊操作。該現象稱為"假上溢"現象。

迴圈佇列:在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始                      位置。自己真從maxsize-1增1變到0,可用取餘運算rear%maxsize和front%maxsize來實現。這實際上是把佇列空間想象成乙個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也

就稱為迴圈佇列。除了一些簡單應用之外,真正實用的佇列是迴圈佇列。[2]

在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存                      單元時,佇列就已經滿了。

3.2 佇列的常見演算法

①初始化佇列:init_queue(q) ,初始條件:隊q 不存在。操作結果:構造了乙個空隊;

②入隊操作: in_queue(q,x),初始條件: 隊q 存在。操作結果: 對已存在的佇列q,插入乙個元素x 到隊尾,隊發生變化;

③出隊操作: out_queue(q,x),初始條件: 隊q 存在且非空,操作結果: 刪除隊首元素,並返回其值,隊發生變化;

④讀隊頭元素:front_queue(q,x),初始條件: 隊q 存在且非空,操作結果: 讀隊頭元素,並返回其值,隊不變;

⑤判隊空操作:empty_queue(q),初始條件: 隊q 存在,操作結果: 若q 為空隊則返回為1,否則返回為0。

4.樹和二叉樹及其演算法

4.1 樹和二叉樹

4.1.1 樹

樹是一種資料結構,它是由n(n>=1)個有限節點組成乙個具有層次關係的集合。

4.1.2 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。

4.2  二叉樹的常見演算法

前序遍歷:前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根節點,然後遍歷左子樹,最後遍歷右子樹。

如,下圖所示二叉樹的遍歷結果是:abdecf

**實現:

private

void preorder(nodenode)

system.

out.println(node.value);

preorder(node.left);

preorder(node.right);

}

中序遍歷:中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。若二叉樹為空則結束返回,否則

如,下圖所示二叉樹的遍歷結果是:dbeafc

}後序遍歷:後序遍歷(lrd)是二叉樹遍歷的一種,也叫做後根遍歷、後序周遊,可記做左右根。後序遍歷有遞迴和非遞迴演算法兩種。在二叉樹中,先左後右再根,即首先遍歷左子樹,然後遍歷右子樹,最後訪                   問根結點。

如,下圖所示二叉樹的遍歷結果是:debfca

**實現:

private

void postorder(nodenode)

postorder(node.left);

postorder(node.right);

system.

out.println(node.value);

}

5.圖及其演算法

5.1 圖

在電腦科學中,乙個圖就是一些頂點的集合,這些頂點通過一系列邊結對(連線)。頂點用圓圈表示,邊就是這些圓圈之間的連線。頂點之間通過邊連線。

5.1.1 圖的分類

①無向圖: 如果圖中任意兩個頂點之間的邊都是無向邊(簡而言之就是沒有方向的邊),則稱該圖為無向圖(undirected graphs)

②有向圖:乙個有向圖d是指乙個有序三元組(v(d),a(d),ψd),其中ψd)為關聯函式,它使a(d)中的每乙個元素(稱為有向邊或弧)對應於v(d)中的乙個有序元素(稱為頂點或點)對

③完全圖:無向完全圖:在無向圖中,如果任意兩個頂點之間都存在邊,則稱該圖為無向完全圖。

④連通圖:任何兩個節點之前都是連通的,都存在一條路徑,並且圖中沒有方向。

⑥簡單圖:在圖中,若不存在頂點到其自身的邊,且同一條邊不重複出現,則稱這樣的圖為簡單圖。

5.2 圖及其常見演算法

5.2.1 bfs(廣度優先搜尋)

定義:廣度優先搜尋是最簡便的圖的搜尋演算法之一,這一演算法也是很多重要的圖的演算法的原型。dijkstra單源最短路徑演算法和prim最小生成樹演算法都採用了和寬度優先搜尋類似的想。其別名又叫bfs,屬於一                 種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。

**實現:

void bfs (graph *g , node *s) 

}s->color =gray;

s->parent =null;

s->d = 0

; enqueue (&q , s);

while (q.count != 0

) ptr_temp = ptr_temp->next;

}temp->color =black;

}

5.2.2 dfs (深度優先搜尋)

**實現:

void dfs(algraph * algraph,int

v)}

常用資料結構及演算法

翻譯來自 linked list stack queue tree binary tree binary search tree trie fenwick tree segment tree heap hashing graph排序 快速排序 合併排序 桶排序 基數排序 圖演算法 深度優先搜尋 廣度...

redis常用資料型別對應的資料結構

redis的資料型別都是通過多種資料結構來實現,主要是出於時間和空間的考慮,當資料量小的時候通過陣列下標訪問最快,占用記憶體最小 壓縮列表是陣列的變種,允許儲存的資料大小不同 因為陣列需要占用連續的記憶體空間,所以當資料量大的時候,就需要使用鍊錶,同時為了保證速度又需要和陣列結合,也就有了雜湊表。1...

資料結構及演算法

總所周知,程式的實質就是 對資料的表示,以及對資料的處理。資料要能被計算機處理,首先必須能夠儲存在計算機的記憶體中,這項任務就是資料的表示,其核心就是資料結構。對乙個實際問題的求解必須滿足實際處理的要求,這項任務就是資料處理,其核心是演算法。有這樣乙個著名公式 是誰提出的有點記不住了 資料結構 演算...