《啊哈!演算法》筆記

2022-08-22 07:57:09 字數 2653 閱讀 2545

第 1 章 排序 

桶排序 

氣泡排序 

快速排序  

第 2 章 棧、佇列、鍊錶  

佇列  

棧  鍊錶  

模擬鍊錶  

第 3 章 列舉!很暴力  

奧數數的全排列 

第 4 章 萬能的搜尋  

深度優先搜尋 

廣度優先搜尋

第 5 章 圖的遍歷

深度和廣度優先

圖的深度優先遍歷 

圖的廣度優先遍歷 

第 6 章 最短路徑  

第 1節 只有五行的演算法——floyd-warshall  

第 2節 dijkstra演算法——通過邊實現鬆弛  

第 3節 bellman-ford——解決負權邊  

第 4節 bellman-ford的佇列優化  

第 5節 最短路徑演算法對比分析

第 7 章 神奇的樹

二叉樹

堆並查集  

1.1桶排序---o(n+m)

1.2氣泡排序---o(n^2)

核心:雙重巢狀迴圈

1.3快速排序(二分法)---o(nlogn)

1)找基準數    

2)先從右往左找到乙個小於6的數,再從左往右找乙個大於6的數,交換

1.4 去重、排序

第一種方法:桶排序、

第二種方法:先排序、後去重,氣泡排序或者快速排序

2.1 佇列

線性結構,只允許在佇列的首部 head 進行刪除,在佇列的尾部 tail 插入

例子:買票;先進先出 fifo

結構體型別:

struct

queue

;

2.2 棧

例子:小桶放球;後進先出

top:指向棧頂的變數

用途:判斷回文詞,

2.4 鍊錶

c語言中,可以使用 指標和函式malloc來實現。 

也可以用陣列模擬鍊錶

結構體 node,兩個成員,data和指標

struct node *head;

head = null;//

頭指標為空

struct node *p;

//動態申請乙個空間,用來存放乙個結點,並用臨時指標p指向這個結點

p = (struct node *)malloc(sizeof(struct

node));

scanf("%d

",&a);

p->data = a;//

將資料儲存到當前結點的data域中

p->next = null;//

設定當前結點的後繼指標指向空,也就是當前結點的下乙個結點為空

->叫做結構體指標運算子,也是用來訪問結構體內部成員的。因為此處p是乙個指標,所以不能使用.號訪問內部成員。

2.5 模擬鍊錶

用陣列模擬鍊錶

兩個陣列,data 和 left

3.1 列舉

3.2 炸彈人

使用陣列模擬地圖

3.3 火柴棍模式

核心是 求方程的解,

3.4 數的全排列

4.1 深度優先搜尋 (depth first search, dfs)

基本模型

void dfs(int

step)返回}

數字全排列

4.2 迷宮問題

4.3 廣度優先搜尋(寬度優先搜尋)breadth first search, bfs

層層遞增

4.4 炸彈人 用 dps、bfs 解

4.5 寶島探險

4.5 水管工遊戲

五、圖的遍歷

5.1 深度和廣度優先

圖的鄰接矩陣法

5.2 圖的深度優先遍歷

六、最短路徑

6.1 floyd-warshall,

6.2 dijikstra 演算法——通過邊實現鬆弛

曲線救國

6.3 bellman-fod——解決負權邊

for(k=1;k<=n-1;k++)

for(i=1;i<=m;i++)

if(dis[v[i]] > dis[u[i]] +w[i])

dis[v[i]] = dis[u[i]] + w[i];

6.4 bellman-ford 的佇列優化

6.5 最短路徑演算法對比分析

七、樹7.1 樹

樹:不包含迴路

圖:包含迴路

樹的特點:1,樹中的任意兩個結點有且只有一條路徑聯通。2,n個結點則有n條邊。3,在一棵樹中加一條邊將會構成乙個迴路。

7.2 二叉樹

完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

滿二叉樹的任意節點,要麼度為0,要麼度為2.

7.3 堆

一種特殊的二叉樹

最小堆:所有父節點都比子節點要小

最大堆:所有父節點都比子節點要大

應用:優先佇列:支援插入元素和尋找最大(小)值元素的資料結構

7.4 並查集

《啊哈!演算法》讀書筆記

啊哈!演算法 零零散散花了一周的時間閱讀了 啊哈!演算法 這本書內容相對基礎,適合初學者時閱讀 當然,大神也可以溫故而知新 啊哈!演算法 這本書中的演算法舉例貼近生活,語言詼諧幽默,不會讓人產生枯燥感,並配有很多幽默的插圖。演算法講解通俗易懂,並配有詳細c語言 和注釋,是一本初學者不易錯過的好書。注...

啊哈,演算法學習筆記(3)

模擬鍊錶 和上一節指標差不多,這裡用了兩個陣列,乙個表示第一次所存資料第二個表示依次所對應數右側數字置 比如data 1 1,data 2 3,data 3 4 則定義right 1 2,表示第乙個數右側數即data 1 右側數3,在data中位值是2,同理right 2 3,right 3 0 這...

演算法1 啊哈演算法!

首先這裡會有乙個簡單的排序演算法。問題 0 10內的數排序,假如有五個人的分數為為9,1,2,4,5 思路 include int main for i 0 i 10 i 依次判斷a 0 a 10 for j 1 j a i j 出現了幾次就列印幾次 printf d i getchar getch...