快速掌握資料結構

2021-09-26 10:42:16 字數 1911 閱讀 6194

串的定義:

限制元素為字元的線性表

串的匹配演算法:

概念:樹的度、節點的度、高度

樹的度:樹中各節點度的最大值

節點的度:節點擁有的子樹個數或分支的個數

高度:樹中節點的最大層次

二叉樹的先序、中序、後序和層次遍歷

先序遍歷過程(遞迴)(也可使用棧):

如果二叉樹為空樹,則什麼都不做;否則

訪問根節點

先序遍歷左子樹

先序遍歷右子樹

中序、後序遍歷類似,只是訪問根節點操作分別位於中間、後面。

層序遍歷過程:

建立乙個迴圈佇列,將二叉樹頭節點入佇列,然後出佇列,訪問該節點,如果它有左子樹,則將左子樹的根節點入列,如果有右子樹,則右子樹根節點入列,然後出列,對出隊節點訪問,如此,直到隊列為空。

應用:

後序:求表示式的值

中序:求二叉樹的深度

哈弗曼樹和哈弗曼編碼

平衡二叉樹

圖的遍歷操作

dfs(遞迴、棧)

類似於二叉樹的先序遍歷。基本思想:首先訪問出發點v,並將其標註為已訪問過;然後選取與v鄰接的未被訪問的任意乙個頂點w,並訪問,再選取與w鄰接的未被訪問的任意乙個頂點,重複。當乙個頂點的所有鄰接頂點都被訪問過時,依次退回最近被訪問過的頂點。直到圖中所有節點都被訪問為止。

bfs(佇列)

類似與二叉樹的層次遍歷。

最小生成樹

普利姆演算法:

從圖中任意取出乙個頂點,把它作為一顆樹,然後從與這棵樹相鄰的邊中選取一條最短的邊,加入這棵樹…重複直到所有節點加入樹中。

複雜度:n^2,適用於稠密圖

克魯斯卡爾演算法:

每次從候選邊(與當前樹不構成迴路的邊)中選中權值最小的邊,加入生成樹,直到所有的邊都被檢查完。

適用於:稀疏圖

最短路徑

迪傑斯特拉演算法:n^2

通常用來求圖中某一頂點到其餘各頂點的最短路徑。

思想:

設有兩個頂點集合s和t,集合s中存放圖中已找到最短路徑的頂點,集合t存放圖中剩餘頂點。

初始狀態,s只含有源點v0,然後不斷從集合t中選取到頂點v0路徑長度最短的頂點vu併入s中。

集合s每併入乙個新的頂點,都要修改頂點v0到集合t中頂點的最短路徑長度值(即是否通過vu到達vo路徑更短)

不斷重複,直達t頂點全部併入s中為止。

弗洛伊德演算法:n^3

動態規劃,**較簡單,

關鍵**:

for k in range(len(distance)):

for i in range(len(distance)):

for j in range(len(distance)):

if distance[i][j] > distance[i][k] + distance[k][j]:

distance[i][j] = distance[i][k] + distance[k][j]

資料結構 快速排序

include include typedef struct qnode typedef struct qlist void qlist init qlist int int void qlist print qlist int part sort qlist int int void quick ...

資料結構 快速排序

快速排序是一種平均效能比較好的排序方法,它的平均效能是 nlogn 快速排序的演算法思想是 1 選取待排序記錄中的一項作為qvoit,即樞軸,以此作為基準,首先將待排序序列分為兩類,一類是比排序序列大的,在基準的右邊。一類是比基準小的,在基準的左邊,當然這裡排序的出發點是從左到右非遞減序列。2 對左...

資料結構 快速排序

選擇乙個基準元素,通常選擇第乙個元素和最後乙個元素,通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於登陸基準元素,此時基準元素在其排好序之後的正確位置,然後再用同樣的方法遞迴的排序劃分的兩部分。通過一次掃瞄將陣列分成了兩部分 分割槽 分別對這兩部分進行partition處理 直到無...