//從今天起準備認真看完這本書。本渣雖然笨,但是窩懶啊。。。。
//今天開始看第一章。希望堅持下去。
第一章 引言
通過討論連通問題的幾種演算法,來引出演算法的重要性。
1.1 連通問題的快速查詢演算法
感覺就是把每個點染色,每個顏色代表一堆,互相連通。每次輸入兩個點,把兩個點所屬那個顏色改為相同,這樣他們代表就都互相連通。
時間複雜度:o(mn), m是輸入指令次數,n是點個數
連通問題的快速查詢演算法1.2 連通問題的快速合併解法#include #define n 10
int id[n]; // 表示每個點的色
int main()
for (i = 0; i < n; ++i)
printf("%d ", id[i]);
printf("\n");
}return 0;
}
就是兩個點相同就把兩個點放到同一棵樹上,這樣兩個點根相同代表他們連通。每次找到兩個點的根,如果不相同,就把乙個跟連到另乙個根上。
時間複雜度:o(mn),m是輸入指令次數,n是點個數。當m>n時,執行次數為mn/2
//1.2 連通問題的快速合併演算法1.3 加權快速合併演算法#include #define n 10
int main()
return 0;
}
記錄每棵樹的節點個數,把節點少的根連到節點多的根。
時間複雜度:lgn。每次找乙個節點的根只需要lgn,因為1+lgi=lg2+lgi=lg(2i)=lg(i+i)<=lg(i+j)
加權快速合併演算法1.4 等分路徑壓縮#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;
}
在查詢根的過程中,使沿路每個節點的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 求...