一:常見的資料結構及演算法
1.線性表及其演算法
1.1 線性表
線性表是最基本、最簡單、也是最常用的一種資料結構。線性表(linear list)是資料結構的一種,乙個線性表是n個具有相同特性的資料元素的有限序列。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其它資料元素都是首尾相接的
1.2 線性表的常見演算法
刪掉線性表中的相同元素,並且按公升序排列
linklist deletesameelem(linklist &l)2.棧及其演算法else
}return l;
}
2.1 棧
棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
2.2 棧的常見演算法
2.2.1 入棧
void pushstack(char x) //2.2.2 出棧入棧
char popstack()3.佇列及其演算法else
}
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
**實現:
private5.圖及其演算法void postorder(nodenode)
postorder(node.left);
postorder(node.right);
system.
out.println(node.value);
}
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)5.2.2 dfs (深度優先搜尋)}s->color =gray;
s->parent =null;
s->d = 0
; enqueue (&q , s);
while (q.count != 0
) ptr_temp = ptr_temp->next;
}temp->color =black;
}
**實現:
void dfs(algraph * algraph,intv)}
常用資料結構及演算法
翻譯來自 linked list stack queue tree binary tree binary search tree trie fenwick tree segment tree heap hashing graph排序 快速排序 合併排序 桶排序 基數排序 圖演算法 深度優先搜尋 廣度...
redis常用資料型別對應的資料結構
redis的資料型別都是通過多種資料結構來實現,主要是出於時間和空間的考慮,當資料量小的時候通過陣列下標訪問最快,占用記憶體最小 壓縮列表是陣列的變種,允許儲存的資料大小不同 因為陣列需要占用連續的記憶體空間,所以當資料量大的時候,就需要使用鍊錶,同時為了保證速度又需要和陣列結合,也就有了雜湊表。1...
資料結構及演算法
總所周知,程式的實質就是 對資料的表示,以及對資料的處理。資料要能被計算機處理,首先必須能夠儲存在計算機的記憶體中,這項任務就是資料的表示,其核心就是資料結構。對乙個實際問題的求解必須滿足實際處理的要求,這項任務就是資料處理,其核心是演算法。有這樣乙個著名公式 是誰提出的有點記不住了 資料結構 演算...