《演算法 C語言實現》閱讀筆記

2022-01-15 07:01:15 字數 2008 閱讀 1148

//從今天起準備認真看完這本書。本渣雖然笨,但是窩懶啊。。。。

//今天開始看第一章。希望堅持下去。

第一章 引言

通過討論連通問題的幾種演算法,來引出演算法的重要性。 

1.1 連通問題的快速查詢演算法

感覺就是把每個點染色,每個顏色代表一堆,互相連通。每次輸入兩個點,把兩個點所屬那個顏色改為相同,這樣他們代表就都互相連通。

時間複雜度:o(mn), m是輸入指令次數,n是點個數

連通問題的快速查詢演算法

#include #define n 10

int id[n]; // 表示每個點的色

int main()

for (i = 0; i < n; ++i)

printf("%d ", id[i]);

printf("\n");

}return 0;

}

1.2 連通問題的快速合併解法

就是兩個點相同就把兩個點放到同一棵樹上,這樣兩個點根相同代表他們連通。每次找到兩個點的根,如果不相同,就把乙個跟連到另乙個根上。

時間複雜度:o(mn),m是輸入指令次數,n是點個數。當m>n時,執行次數為mn/2

//1.2 連通問題的快速合併演算法

#include #define n 10

int main()

return 0;

}

1.3 加權快速合併演算法

記錄每棵樹的節點個數,把節點少的根連到節點多的根。

時間複雜度:lgn。每次找乙個節點的根只需要lgn,因為1+lgi=lg2+lgi=lg(2i)=lg(i+i)<=lg(i+j)

加權快速合併演算法

#include #define n 10

int main()

while (scanf("%d%d", &p, &q) == 2) else if (i != j)

for (i = 0; i < n; ++i)

printf("%d ", id[i]);

printf("\n");

}return 0;

}

1.4 等分路徑壓縮

在查詢根的過程中,使沿路每個節點的id指向根。 

時間複雜度:接近o(n)?

等分路徑壓縮

#include #define n 10

int main()

while (scanf("%d%d", &p, &q) == 2)

for (j = q; j != id[j]; j = id[j])

id[j] = id[id[j]];

if (i != j && sz[i] < sz[j]) else if (i != j)

for (i = 0; i < n; ++i)

printf("%d ", id[i]);

printf("\n");

}return 0;

}

說一下窩對①處的理解。

如果該節點為根節點或深度為2,即

或則不改變。

如果深度為3,則

深度為4

深度為5

深度為6

這樣每個節點的深度小了。搜尋根節點的複雜度變小。(然而我覺得並沒有什麼卵用。。。。)

c語言實現磁碟排程演算法 C語言實現洗牌演算法

首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...

lfu演算法實現c語言 lru演算法c語言實現

a 分配頁面 b 置換演算法 c 程式訪問 d 換出頁面 正確答案 d 單選題 22.設某程序的頁訪問串為 1 3 1 2 4,工作集為 3 塊,問 按 lru 頁面替換演算法,儲存管理採取虛擬儲存技術 組成 物理記憶體 主機板上的ram 和硬碟上的 虛擬記憶體聯合組成 頁面大小 4kb 例 頁面排...

C語言實現遞迴演算法

c語言實現遞迴演算法 遞迴演算法是運用於函式呼叫中的。遞迴的概念 在乙個函式體內呼叫自身稱為函式的遞迴呼叫。遞迴呼叫的原理 需要在函式內滿足一定的條件後不在呼叫自身或者結束,或者呼叫其它函式,否則容易出現類似死迴圈的情況,程式將癱瘓。已知 f 1 1 f 0 0,fn n f n 1 f n 2 求...