導航:首頁 > 源碼編譯 > 集合覆蓋演算法有序數據

集合覆蓋演算法有序數據

發布時間:2023-01-02 20:56:23

A. 《演算法導論》(第三版)目錄

1.1 演算法

1.2 作為一種技術的演算法

2.1 插入排序

2.2 分析演算法

2.3 設計演算法

2.3.1 分治法

2.3.2 分析分治演算法

3.1 漸近記號

3.2 標准記號與常用函數

4.1 最大子數組問題

4.2 矩陣乘法的 Strassen 演算法

4.3 用代入法求解遞歸式

4.4 用遞歸樹方法求解遞歸式

4.5 用主方法求解遞歸式

*4.6 證明主定理

4.6.1 對 b 的冪證明主定理

4.6.2 向下取整和向上取整

5.1 僱傭問題

5.2 指示器隨機變數

5.3 隨機演算法

*5.4 概率分析和指示器隨機變數的進一步使用

5.4.1 生日悖論

5.4.2 球與箱子

5.4.3 特徵序列

5.4.4 在線僱傭問題

6.1 堆

6.2 維護堆的性質

6.3 建堆

6.4 堆排序演算法

6.5 優先隊列

7.1 快速排序的描述

7.2 快速排序的性能

7.3 快速排序的隨機化版本

7.4 快速排序分析

7.4.1 最壞情況分析

7.4.2 期望運行時間

8.1 排序演算法的下界

8.2 計數排序

8.3 基數排序

8.4 桶排序

9.1 最小值和最大值

9.2 期望為線性時間的選擇演算法

9.3 最壞情況為線性時間的選擇演算法

10.1 棧和隊列

10.2 鏈表

10.3 指針和對象的實現

10.4 有根樹的表示

11.1 直接定址表

11.2 散列表

11.3 散列函數

11.3.1 除法散列法

11.3.2 乘法散列法

*11.3.3 全域散列法

11.4 開放定址法

11.5 完全散列

12.1 什麼是二叉樹

12.2 查詢二叉搜索樹

12.3 插入和刪除

12.4 隨機構建二叉搜索樹

13.1 紅黑樹的性質

13.2 旋轉

13.3 插入

13.4 刪除

14.1 動態順序統計

14.2 如何擴張數據結構

14.3 區間樹

15.1 鋼條切割

15.2 矩陣鏈乘法

15.3 動態規劃原理

15.4 最長公共子序列

15.5 最優二叉搜索樹

16.1 活動選擇問題

16.2 貪心演算法原理

16.3 赫夫曼編碼

*16.4 擬陣和貪心演算法

*16.5 用擬陣求解任務調度問題

17.1 聚合分析

17.2 核演算法

17.3 勢能法

17.4 動態表

17.4.1 表擴張

17.4.2 表擴張和收縮

18.1 B 樹的定義

18.2 B 樹上的基本操作

18.3 從 B 樹上刪除關鍵字

19.1 斐波那契結構

19.2 可合並堆操作

19.3 關鍵字減值和刪除一個結點

19.4 最大度數的界

20.1 基本方法

20.2 遞歸結構

20.2.1 原型 van Emde Boas 結構

20.2.2 原型 van Emde Boas 結構上的操作

20.3 van Emde Boas 樹及其操作

20.3.1 van Emde Boas 樹

20.3.2 van Emde Boas 樹的操作

21.1 不相交集合的操作

21.2 不相交集合的鏈表表示

21.3 不相交集合森林

*21.4 帶路徑壓縮的按秩合並的分析

22.1 圖的表示

22.2 廣度優先搜索

22.3 深度優先搜索

22.4 拓撲排序

22.5 強連通分量

23.1 最小生成樹的形成

23.2 Kruskal 演算法和 Prim 演算法

24.1 Bellman-Ford 演算法

24.2 有向無環圖中的單源最短路徑問題

24.3 Dijkstra 演算法

24.4 差分約束和最短路徑

24.5 最短路徑性質的證明

25.1 最短路徑和矩陣乘法

25.2 Floyd-Warshall 演算法

25.3 用於稀疏圖的 Johnson 演算法

26.1 流網路

26.2 Ford-Fulkerson 方法

26.3 最大二分匹配

*26.4 推送-重貼標簽演算法

*26.5 前置重貼標簽演算法

27.1 動態多線程基礎

27.2 多線程矩陣乘法

27.3 多線程歸並排序

28.1 求解線性方程組

28.2 矩陣求逆

28.3 對稱正定矩陣和最小二乘逼近

29.1 標准型和鬆弛型

29.2 將問題表達為線性規劃

29.3 單純形演算法

29.4 對偶性

29.5 初始基本可行解

30.1 多項式的表示

30.2 DFT 和 FFT

30.3 高效 FFT 實現

31.1 基礎數論概念

31.2 最大公約數

31.3 模運算

31.4 求解模線性方程

31.5 中國余數定理

31.6 元素的冪

31.7 RSA 公鑰加密系統

*31.8 素數的測試

*31.9 整數的因子分解

32.1 樸素字元串匹配演算法

32.2 Rabin-Karp 演算法

32.3 利用有限自動機進行字元串匹配

32.4 Knuth-Morris-Pratt 演算法

33.1 線段的性質

33.2 確定任意一對線段是否相交

33.3 尋找凸包

33.4 尋找最近點對

34.1 多項式時間

34.2 多項式時間的驗證

34.3 NP 完全性與可歸約性

34.4 NP 完全性的證明

34.5 NP 完全問題

34.5.1 團問題

34.5.2 頂點覆蓋問題

34.5.3 哈密頓迴路問題

34.5.4 旅行商問題

34.5.5 子集和問題

35.1 頂點覆蓋問題

35.2 旅行商問題

35.2.1 滿足三角不等式的旅行商問題

35.2.2 一般旅行商問題

35.3 集合覆蓋問題

35.4 隨機化和線性規劃

35.5 子集和問題

A.1 求和公式及其性質

A.2 確定求和時間的界

B.1 集合

B.2 關系

B.3 函數

B.4 圖

B.5 樹

B.5.1 自由樹

B.5.2 有根樹和有序樹

B.5.3 二叉樹和位置樹

C.1 計數

C.2 概率

C.3 離散隨機變數

C.4 幾何分布與二項分布

C.5 二項分布的尾部

D.1 矩陣與矩陣運算

D.2 矩陣的基本性質

B. 集合覆蓋演算法用直徑還是半徑快遞點

集合覆蓋演算法用半徑更快捷。集合覆蓋問題(SetCoveringProblem,簡稱SCP)是運籌學研究中典型的組合優化問題之一,工業領域里的許多實際問題都可建模為集合覆蓋問題,如資源選擇問題、設施選址問題(移動基站的選址、物流中心的選址)等。

C. 《演算法圖解》pdf

本書示例豐富,圖文並茂,以讓人容易理解的方式闡釋了演算法,旨在幫助程序員在日常項目中更好地發揮演算法的能量。書中的前三章將幫助你打下基礎,帶你學習二分查找、大O表示法、兩種基本的數據結構以及遞歸等。餘下的篇幅將主要介紹應用廣泛的演算法,具體內容包括:面對具體問題時的解決技巧,比如,何時採用貪婪演算法或動態規劃;散列表的應用;圖演算法;Kzui近鄰演算法。

目錄
前言
致謝
關於本書
第1章 演算法簡介1
1.1引言1
1.1.1性能方面1
1.1.2問題解決技巧2
1.2二分查找2
1.2.1更佳的查找方式4
1.2.2運行時間8
1.3大O 表示法8
1.3.1演算法的運行時間以不同的速度增加9
1.3.2理解不同的大O運行時間10
1.3.3大O 表示法指出了最糟情況下的運行時間12
1.3.4一些常見的大O運行時間12
1.3.5旅行商13
1.4小結15
第2章 選擇排序16
2.1內存的工作原理16
2.2數組和鏈表18
2.2.1鏈表19
2.2.2數組20
2.2.3術語21
2.2.4在中間插入22
2.2.5刪除23
2.3選擇排序25
2.4小結28
第3章 遞歸29
3.1遞歸29
3.2基線條件和遞歸條件32
3.3棧33
3.3.1調用棧34
3.3.2遞歸調用棧36
3.4小結40
第4章 快速排序41
4.1分而治之41
4.2快速排序47
4.3再談大O表示法52
4.3.1比較合並排序和快速排序53
4.3.2平均情況和最糟情況54
4.4小結57
第5章 散列表58
5.1散列函數60
5.2應用案例63
5.2.1將散列表用於查找63
5.2.2防止重復64
5.2.3將散列表用作緩存66
5.2.4小結68
5.3沖突69
5.4性能71
5.4.1填裝因子72
5.4.2良好的散列函數74
5.5小結75
第6章 廣度優先搜索76
6.1圖簡介77
6.2圖是什麼79
6.3廣度優先搜索79
6.3.1查找最短路徑82
6.3.2隊列83
6.4實現圖84
6.5實現演算法86
6.6小結93
第7章 狄克斯特拉演算法94
7.1使用狄克斯特拉演算法95
7.2術語98
7.3換鋼琴100
7.4負權邊105
7.5實現108
7.6小結116
第8章 貪婪演算法117
8.1教室調度問題117
8.2背包問題119
8.3集合覆蓋問題121
8.4NP 完全問題127
8.4.1旅行商問題詳解127
8.4.2如何識別NP 完全問題131
8.5小結133
第9章 動態規劃134
9.1背包問題134
9.1.1簡單演算法135
9.1.2動態規劃136
9.2背包問題FAQ143
9.2.1再增加一件商品將如何呢143
9.2.2行的排列順序發生變化時結果將如何145
9.2.3可以逐列而不是逐行填充網格嗎146
9.2.4增加一件更小的商品將如何呢146
9.2.5可以偷商品的一部分嗎146
9.2.6旅遊行程最優化147
9.2.7處理相互依賴的情況148
9.2.8計算最終的解時會涉及兩個以上的子背包嗎148
9.2.9最優解可能導致背包沒裝滿嗎149
9.3最長公共子串149
9.3.1繪制網格150
9.3.2填充網格151
9.3.3揭曉答案152
9.3.4最長公共子序列153
9.3.5最長公共子序列之解決方案154
9.4小結155
第10章 K 最近鄰演算法156
10.1橙子還是柚子156
10.2創建推薦系統158
10.2.1特徵抽取159
10.2.2回歸162
10.2.3挑選合適的特徵164
10.3機器學習簡介165
10.3.1OCR165
10.3.2創建垃圾郵件過濾器166
10.3.3預測股票市場167
10.4小結167
第11章 接下來如何做168
11.1樹168
11.2反向索引171
11.3傅里葉變換171
11.4並行演算法172
11.5MapRece173
11.5.1分布式演算法為何很有用173
11.5.2映射函數173
11.5.3歸並函數174
11.6布隆過濾器和HyperLogLog174
11.6.1布隆過濾器175
11.6.2HyperLogLog176
11.7SHA 演算法176
11.7.1比較文件177
11.7.2檢查密碼178
11.8局部敏感的散列演算法178
11.9Diffie-Hellman 密鑰交換179
11.10線性規劃180
11.11結語180
練習答案181

最後,這里為大家准備了幾百本的互聯網電子書,有需要的過來取吧。 點擊獲取

D. 求C++集合覆蓋問題代碼

voidmain()
{int i;
for(i=1;;i++)
{if(i%5==1&&i%6==5&&i%7==4&&i%11==10)
{printf("%d",i);break;}}}

Ø 用遞歸方法計算下列函數的值:
fx (x, n)=x-x2+x3-x4+......(-1)n-1xn n>0

E. 演算法圖解 PDF 高清版

像小說集一樣趣味的演算法新手入門書。
演算法是解決困難的一步步步驟,都是電子信息科學行業的關鍵主題。現如今程序員*常見的演算法早已歷經了古人的探索、檢測及證實。假如你要搞明白這種演算法,又不願困在在繁雜的證實中,這書更是你的不二選擇。這部圖例豐富多彩、扣人心弦的好用手冊將給你輕輕鬆鬆懂得怎樣在自身的程序流程中高效率應用關鍵的演算法。
這書範例豐富多彩,圖片配文字,以令人非常容易了解的方法詮釋了演算法,致力於協助程序員在平時新項目中充分發揮演算法的動能。書中的前三章將協助你奠定基礎,陪你學習培訓二分查找、大O表示法、二種基礎的數據結構及其遞歸等。剩下的篇數將關鍵詳細介紹運用普遍的演算法,主要內容包含:應對實際難題時的處理方法,例如,什麼時候選用貪欲演算法或動態規劃;散列表的運用;圖演算法;Kzui近鄰演算法。

目錄
前言
致謝
關於本書
第1章 演算法簡介1
1.1引言1
1.1.1性能方面1
1.1.2問題解決技巧2
1.2二分查找2
1.2.1更佳的查找方式4
1.2.2運行時間8
1.3大O 表示法8
1.3.1演算法的運行時間以不同的速度增加9
1.3.2理解不同的大O運行時間10
1.3.3大O 表示法指出了最糟情況下的運行時間12
1.3.4一些常見的大O運行時間12
1.3.5旅行商13
1.4小結15
第2章 選擇排序16
2.1內存的工作原理16
2.2數組和鏈表18
2.2.1鏈表19
2.2.2數組20
2.2.3術語21
2.2.4在中間插入22
2.2.5刪除23
2.3選擇排序25
2.4小結28
第3章 遞歸29
3.1遞歸29
3.2基線條件和遞歸條件32
3.3棧33
3.3.1調用棧34
3.3.2遞歸調用棧36
3.4小結40
第4章 快速排序41
4.1分而治之41
4.2快速排序47
4.3再談大O表示法52
4.3.1比較合並排序和快速排序53
4.3.2平均情況和最糟情況54
4.4小結57
第5章 散列表58
5.1散列函數60
5.2應用案例63
5.2.1將散列表用於查找63
5.2.2防止重復64
5.2.3將散列表用作緩存66
5.2.4小結68
5.3沖突69
5.4性能71
5.4.1填裝因子72
5.4.2良好的散列函數74
5.5小結75
第6章 廣度優先搜索76
6.1圖簡介77
6.2圖是什麼79
6.3廣度優先搜索79
6.3.1查找最短路徑82
6.3.2隊列83
6.4實現圖84
6.5實現演算法86
6.6小結93
第7章 狄克斯特拉演算法94
7.1使用狄克斯特拉演算法95
7.2術語98
7.3換鋼琴100
7.4負權邊105
7.5實現108
7.6小結116
第8章 貪婪演算法117
8.1教室調度問題117
8.2背包問題119
8.3集合覆蓋問題121
8.4NP 完全問題127
8.4.1旅行商問題詳解127
8.4.2如何識別NP 完全問題131
8.5小結133
第9章 動態規劃134
9.1背包問題134
9.1.1簡單演算法135
9.1.2動態規劃136
9.2背包問題FAQ143
9.2.1再增加一件商品將如何呢143
9.2.2行的排列順序發生變化時結果將如何145
9.2.3可以逐列而不是逐行填充網格嗎146
9.2.4增加一件更小的商品將如何呢146
9.2.5可以偷商品的一部分嗎146
9.2.6旅遊行程最優化147
9.2.7處理相互依賴的情況148
9.2.8計算最終的解時會涉及兩個以上的子背包嗎148
9.2.9最優解可能導致背包沒裝滿嗎149
9.3最長公共子串149
9.3.1繪制網格150
9.3.2填充網格151
9.3.3揭曉答案152
9.3.4最長公共子序列153
9.3.5最長公共子序列之解決方案154
9.4小結155
第10章 K 最近鄰演算法156
10.1橙子還是柚子156
10.2創建推薦系統158
10.2.1特徵抽取159
10.2.2回歸162
10.2.3挑選合適的特徵164
10.3機器學習簡介165
10.3.1OCR165
10.3.2創建垃圾郵件過濾器166
10.3.3預測股票市場167
10.4小結167
第11章 接下來如何做168
11.1樹168
11.2反向索引171
11.3傅里葉變換171
11.4並行演算法172
11.5MapRece173
11.5.1分布式演算法為何很有用173
11.5.2映射函數173
11.5.3歸並函數174
11.6布隆過濾器和HyperLogLog174
11.6.1布隆過濾器175
11.6.2HyperLogLog176
11.7SHA 演算法176
11.7.1比較文件177
11.7.2檢查密碼178
11.8局部敏感的散列演算法178
11.9Diffie-Hellman 密鑰交換179
11.10線性規劃180
11.11結語180
練習答案181

自取: https://url80.ctfile.com/f/32319880-518802548-9892a0
(訪問密碼:3284)

F. 演算法基礎

謹以此文,感謝我在這個學校最喜歡的兩個老師之一——肖my老師。本文基本為老師上課說講授內容加上一部分自己的感悟拼湊而來,寫作文本的目的是為自己的演算法課程留下一點點東西,站在老師肩膀上形成粗糙的框架,方便以後的復習以及深入。文筆有限,其中包含的錯誤還請多多包容,不吝賜教。

to do list:

時間復雜度中遞歸樹法;動規,分治新的感悟;

點覆蓋:一組點的集合,使得圖中所有邊都至少與該集合中一個點相連。

支配集:一組點的集合,使得圖中所有的點要麼屬於該集合,要麼與該集合相連。

最大團:在一個無向圖中找出點數最多的完全圖。

獨立集:一組點的集合,集合中的頂點兩兩不相鄰。(團轉過來)

SAT問題:也稱布爾可滿足性問題。給一組變

其中Ci被稱為句子。

點覆蓋<->獨立集<->最大團

最小割:割是一組邊集。如s-t割就是如果去掉這些邊,將把原圖劃分為兩個點集,其中一個點集包含s,一個點集包含t。(兩個是指不相連,而不是代表不存在邊相連,如反向邊)

decision problem: 是否存在。

search problem:找到一個解。

(這個還能擴展,比如decision problem在多項式時間內解決,所以他是P問題嗎)

漸進符號:

注意以上三種都是緊的,對應的兩個小寫的符號是不緊的,即如下圖所示:

概念:演算法的時間復雜度是一個函數,用於定性描述演算法的運行時間。注意,這個一個代表演算法輸入字元串長度的函數。

[注]輸入字元串長度是一個比較關鍵的理解,比如在背包問題中,其時間復雜度為O(nW),因為W不定,所以只能是一個偽多項式時間。

比較:c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n! < n^n

大致:常數<對數<冪函數<指數函數<階乘

對於指數是n相關的進行比較,優先比較指數,再比較底數。

記住一個特例:n (logn)<n!<n n

計算:

一般來說,計算採用主方法和遞歸樹法,其中遞歸樹技巧性比較強,主方法其實也是遞歸樹推導歸納而來,且主方法能得到一個比較緊的結果。

主方法:

f(n) = af(n-b)+g(n) =>O( a^(n/b) *g(n) )

P:decision problems有一個多項式演算法。

NP(nondeterministic polynomial-time):decision problems能夠在多項式時間內驗證。

NPC:NP完全問題,首先這個問題是NP的,其次,其他所有問題都可以多項式時間內歸約到它。

NPH:如果所有NP問題都可以多項式時間歸約到某個問題,則稱該問題為NP困難。

因為NP困難問題未必可以在多項式時間內驗證一個解的正確性(即不一定是NP問題),因此即使NP完全問題有多項式時間的解(P=NP),NP困難問題依然可能沒有多項式時間的解。因此NP困難問題「至少與NP完全問題一樣難」。

一些NP問題能在多項式時間內解決,因為 P∈NP

NP難類型問題的證明:

先選好一個已知NP難的問題,然後將已知NP難問題多項式歸約到要證明的問題上。先給出這個歸約,然後再證明這個歸約的正確性。

NPC類型問題的證明:

證明一個問題Y是NPC問題,先說明Y是NP的,然後找到一個NPC問題X,將這個問題X歸約到問題Y上,即證明完成。

常見的NPC問題(重要,規約的時候有用!):

packing problems: set-packing,獨立集

覆蓋問題:集合覆蓋問題,頂點覆蓋問題

嚴格滿足問題(constraint satisfaction problems):SAT,3SAT

序列問題:哈密爾頓迴路,旅行商問題

劃分問題:3D-matching, 3著色問題

數字問題:子集合問題(子集元素之和為t),背包問題

其他:分團問題(是否存在一個規模為k的團)

規約的概念與理解

規約:意味著對問題進行轉換,例如將一個未知的問題轉換成我們能夠解決的問題,轉換的過程可能涉及到對問題的輸入輸出的轉換。

自歸約:search problem <=p decision problem

歸約:A歸約到B,也就是說,我們對A套一個函數f,在f函數的作用下形成一個新的問題,對這個問題運用B的黑盒解法,能夠解決問題A。

(B <=p A)一般說來,B問題如果可以歸約到A問題,也就是說,一個解決A問題的演算法可以被用做子函數(子程序)來解決B問題,也就是說,求解B問題不會比求解A問題更困難。因此,如果B問題是困難的,那麼A問題也就是困難的,因為不存在求解A問題的高效演算法。(最後一句不懂)

我簡單說一下我理解的規約,以X規約到Y為准,大概分成兩個方面:

註:在 的一些實例中細品。

概念:在對問題求解時,總是做出在當前看來是最好的選擇。

貪心的證明:先假設貪心演算法得到的解不是最優解,假設S1是貪心演算法得到的解,而S2是所有最優解中和S1具有最多相同元素的解,然後比較S1和S2,觀察S1和S2中第一個(最前面一個)不一樣的元素,然後在貪心解S2中將不一樣的元素換成S1中的那個元素得到另一個最優解S3,這樣S3和S1比S2和S1有更多相同元素,和假設S2是與S1有最多相同元素的最優解矛盾,這樣來推導S1是最優解。

我的理解:假設這個不是最優的,但是一定存在一個最優的解在某一個位置之前和我當前解結構是一樣的,那麼在這個位置,選最優解也可以選當前解,不影響最終答案。

[注]概念很簡單,但是實際操作的時候,貪心的角度很重要,同樣的貪心,方向對了,演算法就是對的。

例子:

給你一系列活動,每個活動有一個起始時間和一個結束時間,要求在活動不沖突的情況下找到一種有最多活動的安排。

對於這個問題,我們有一下幾種貪心的角度:

①將任務按照 開始時間 升序排列。

②將任務按照 結束時間 升序排列。

③將任務按照 任務時長 升序排列。

④對於每一個任務,都記錄與其他任務沖突的數量,按照 沖突數量 的升序排列。

其中1,3,4都是不可以的。

任務結束時間的貪心證明(反證法):

假設貪心不是最最優的,那我們在最優解中找一個與當前解有最相似的解。

由圖可以知道,貪心貪的就是最早結束,所以如果不是最優,那麼最優的結束時間一定晚於貪心的結束時間。

由上圖就可以證明。

最大流通常與最小割相聯系。

f 為任意一個流,cap為容量,對於任意的s-t割出來的點集(A,B),v( f ) <= cap(A, B)。

當流增加到與割的容量相等時候,就不可能再有增長空間了,稱為最大流。

對於割的容量來說,不同的割法會有不同流量,有些割法永遠不會有流達到,比如部分A = {s}, B = {V - s},這種把源點割出來的割法。

綜上,通過這種感性的認識,如果能找到一個最小的割,那麼這個割就一定是最大能跑到的流(如果流能更高的話在這個割上就會超過容量,反證。)

上圖為一條增廣路,一條增廣路即為一條s-t的路徑,在路徑上仍有流可以跑,其曾廣的流就是該條路徑上最小的剩餘容量。(相當於每找一條增廣路,就至少有一條邊達到滿流。)

直到在圖中找不到增廣路,此時已經達到了最大流。

找ST集合:把滿流的邊去掉,從S出發走到能到的點,遍歷的點就是S集合;剩下的點就屬於T集合。注意,如果找到了在找S集合的時候找到了T點,說明還可以繼續找增廣路。

[補]有一個很有趣的延伸,如多源點多終點問題。問:如果我有兩個源點s1,s2,兩個終點t1,t2,我想求一組流,使得s1-t1,s2-t2的流達到最大,是否可以加一個源點S,S與s1,s2相連,邊流無限大;加一個終點T,T與t1,t2相連,邊流無限大,然後這組ST的最大流即可。——答案是No,無法保證是s1-t1,s2-t2,有可能交錯。

例子講的感覺不是特別好,對理解感覺起不到很大作用,希望以後有新的想法後進行補充。

規約是一個重要的概念和思想。

一個圖的 最大獨立集 與 最小點覆蓋 是不相交的兩個點集,它們的並就是整個點集。

個人理解:獨立集和點覆蓋都是從點的角度進行劃分的,如果我們從邊的角度來看,①一個最小的點覆蓋即為我集合中的每一個點都盡可能與更多的邊相連,②同時,一條邊的兩個端點中,只能有一個端點在最小點覆蓋中[下注]

[注]我們假設有一條邊兩個端點(u,v)都在點覆蓋之中,首先顯然u,v都不是端點,因為假設u是端點的話只需要選擇v即可;

給一個集合S和一堆S的子集S1,S2,...,Sm,問是否存在存在k個子集,使它們的並集為S。

構造:

集合為點,集合中的元素為邊,有相同元素的邊相連。(注意如果某一元素只在一個子集中出現,應該怎麼處理呢!)

規約:在構造的圖中找最小的點覆蓋,選中的點能覆蓋所有的邊即為對應集合的並集能包含所有的元素。所以就完成了集合覆蓋到點覆蓋的規約。

構造:每個句子構造一個三角形,把對應變數但是相反取值的點相連。

規約:3SAT的有一個特點就是,每一個句子中至少有一個為真即可,每個句子都必須是真。將相同變數相反取值相連的目的就是,在最大獨立集中,比如選擇x為真,則剩下所有句子中x-ba一定不會被選中,同時由獨立集和構造出來三角形的性質可以知道,每一個句子,有且僅有一個會被選中(為真)。如上圖,x1-ba為真,x2-ba和x3任選一個為真即可滿足。

search problem <=p decision version

比如:如果能在多項式時間內找到一個哈密爾頓圈,那麼就能在多項式時間內找到一個哈密爾頓圈(刪邊)

在此再談P和NP:

我們知道有些問題是可以從搜索問題規約到判斷問題的,也就是所該問題如果能在多項式內判斷,那麼久能在多項式中搜索到,那麼我們只需要說,這個判斷問題能在多項式時間內求解,就叫做P問題,也就是上圖紅字的意思;那NP問題呢,必須要給出一個解的實例,判斷的是這個實例是否滿足求解問題,這個才是上圖中的紅字。比如,我如果能在多項式時間內判斷哈密爾頓圈是否(Yes/No)存在,那這個就是ploy-time algorithm,如果我給出了一系列點,能過多項式時間內判斷這些點能否構成哈密爾頓圈,那這個就是poly-time certifier。

構造:把一個點拆分成三個點。

構造:(下面兩個圖要連在一起看)

從行的角度看,一行代表一個變數;從列的角度來看,每三列代表一個句子。兩邊中一邊是兩個點,一邊是一個點,所以有k個句子的話,每一行有3k+3個節點。從哈密爾頓圈的答案轉到3SAT的答案看這個圈在每一行是從左到右還是從右到左。

子集和問題:給一個集合S,問是否能在集合中選取元素,使得總和為W。

構造:如下圖,按照前六行和前三列進行分割,可以分成4部分,其中1,3,4部分是固定的,即在第一部分,變數v列和 變數為v(包括變數及取反)的行對應的格子為0,其餘為0;第三部分全為0;第四部分按照12依次寫下來。第二部分,如果Ci句子中有變數v,則記為1,因為一個句子只有三個變數,可以簡單通過第二部分每一列和為3進行判定。此時集合已經構造出來,W為111444,與上面的規約相似,可以通過3SAT的簡單性質進行感性的認知。

近似的想法很簡單,要解決一個問題,我們希望能夠做到①求解結果是最優的 ②在多項式時間內解決 ③對於任意的實例都能夠通過該演算法解決。現在對於部分問題,無法完全滿足以上要求,所以就犧牲了①,但是我們希望結果不是盲目的,所以就引入了近似的概念。

近似演算法。比如2-近似,認為W為近似解,W 為最優解,在求最小值的情況下W<=2W ;在求最大值的情況下,W>=1/2W*

給m個機器和n個任務,每個任務有一個ti的執行時間,我們認為完成最後一個任務所需的時間為負載時間,希望能夠讓這個負載時間最短。

第一種:將任務依次放在機器上,當某個機器空閑時立即放入新任務。此時是2近似的。

證明:

引理1.最短時間安排是大於等於任務中時間最長的任務,L* >= max tj

我們在考慮放入最後一個任務前,根據我們放置的規則,該機器是耗時最短,也就是說,該機器此時的用時是低於除掉最後一個任務後的平均時長,更低於所有任務的平均時長(引理2);再根據引理1,最後一個任務應該是小於最優解的。

補充:

在這里,我還想討論一下這個近似演算法的中等於符號,先上結論:等號不一定能夠找到一個實例,但是可以構造出一種結構,通過取極限求得,我們認為這樣 也算是緊的。

構造實例:有m個機器,其中m(m-1)個任務的用時為1,1個任務的用時為m。肯定有一種任務集合,可以按照以下方式進行安排,此時的貪心解為19。

此時最佳的解為10,如下圖:

通過推廣可以知道此時的比為(2m-1)/m,當m取極限,能夠達到2倍。

第二種:將任務從大到小排序,然後依次放在機器上,當某個機器空閑時立即放入新任務。此時是2近似的。

引理3:如果有大於m個任務,那麼L*>=2t(m-1)。證明:t(m+1)是目前最短的任務,且目前所有機器上都有任務了,所以該任務加入時最優的情況不過是加入設備的原有任務剛好和t(m+1)相等,即等號。

(2近似)在n個點中,選取k個中心點,使得這些中心點能夠以半徑R的圓包含所有的點,讓其中最大的半徑最小,如下圖所示:

基礎:距離需要滿足的三個定理①(同一性)dist(x, x) = 0 ②(自反)dist(x, y) = dist(y, x) ③(三角不等式)dist(x, y) <=dist(x, z)+dist(z, y)

r(C)為C集合中所有點的最大覆蓋半徑。(需要求min r(C))

演算法:在點集中任選一個作為中心點,然後重復以下步驟k-1次:選取距離已選點集中最遠的點,加入點集。

證明:先假設r(C )< 1/2 * r(C)以選好的點畫半徑為1/2 * r(C)的圓,顯然可知[注],這個圓里有且僅有一個r(C )中的點。那麼根據在下圖中,根據三角不等式可以得出:

[注]在每個點上r(c )一定會包含到c點,而r(C )<1/2 * r(C),相當於大圓套小圓,所以c*一定在c的圓中。

(2近似)問題還是很好理解的,在點上加權值,要找一個點覆蓋,使得權值最小。如下圖左邊就是一個帶權的最小點覆蓋。

演算法: 任選一條邊(i, j)加上代價,這個代價從零開始,且這個代價的最大值低於i和j節點的權值。顯然,這個邊權值的最大值取決於兩個端點權值的最小值,我們認為當邊權值與點權值相等時,對應的那個點是緊的。把所有緊的點找出來即為點覆蓋。

流程:

證明:

引理:邊權之和小於等於點覆蓋的點權之和。這主要是由於涉及到一條邊上兩個點都被選(緊的)的情況,感性認知可以看上圖,縮放證明如下:

w(S)是等於所選的節點的權值之和的,等於所選節點節點所對應的邊權之和,可以把它放大到所有節點對應邊權之和,這樣因為一條邊(u, v)在u上算過一次後還要在v上算一次,所以等於邊權和的兩倍。再由上面引理可得。

主要為了線性規劃和整數規劃。

(2近似)沒啥好說的,只需要把方程構造出來就行了。

由於求解出來結果不一定是整數,所以我們認為某一點的值大於1/2,就選入點集。

證明:

因為xi+xj >=1,且都是正數,那必至少一個點是大於1/2的(反證,兩個都小於1/2則和小於1)。

給你n個物品和一個背包,每個物品有一個價值v和一個大小w,背包的容量是W,要求讓背包裝下盡可能大價值。

背包的時間復雜度:O(nW)

注意其中n表示物品的個數,無論是1個還是999個,他都是多項式的,這個很好理解。但是W就不一樣了,這是一個數字。我理解的是這個數字會很奇特,比如1.00001,比如99999,這些有可能看起來不大但是實際在處理的時候很難處理的數字,統一的來說,如果我們把這些數字放在電腦上,都會以二進制的方式存儲起來,有些數字用十進製表示很小,但是放在二進制上面就會很大,由W導致不能在多項式時間內解決(找不到一個范圍/上界來框它)。

演算法: 為了處理這個問題,我們改動了dp的狀態轉移方程,要讓這個轉移方程和W無關[注]。

此時還不是多項式的,然後我們再對value進行約。[注]

[注]這兩步中,我們把w改成v,並對v進行近似處理。OPT的含義變成了,在面對是否選擇第i個物品時,要想讓價值達到當前值,最少的weight。理由是更改後的誤差是可以忍受的:對v進行近似,結果只會出現最大價值的上下誤差,如果對w進行近似,則有可能出現該物品不能放入背包中,導致整個物品直接放棄的情況。

G. 求解最小集合數覆蓋所有元素。

如果說「最少幾個集合」,那麼是一個,因為這個集合是{k1,k2,k3,...,kn},已經可以滿足了

如果說「最少幾個集合必定能夠包含k1到kn」,則利用抽屜定理,如果從中選取n個,則必定覆蓋所有元素

H. 近似演算法的集合覆蓋問題的近似演算法

問題描述:給定一個完全無向圖G=(V,E),其每一邊(u,v)∈E有一非負整數費用c(u,v)。要找出G的最小費用哈密頓迴路。
集合覆蓋問題的一個實例〈X,F〉由一個有限集X及X的一個子集族F組成。子集族F覆蓋了有限集X。也就是說X中每一元素至少屬於F中的一個子集,即X= 。對於F中的一個子集CF,若C中的X的子集覆蓋了X,即X= ,則稱C覆蓋了X。集合覆蓋問題就是要找出F中覆蓋X的最小子集C*,使得
|C*|=min{|C||CF且C覆蓋X}
集合覆蓋問題舉例:用12個黑點表示集合X。F={S1,S2,S3,S4,S5,S6,},如圖所示。容易看出,對於這個例子,最小集合覆蓋為:C={S3,S4,S5,}。
集合覆蓋問題近似演算法——貪心演算法
Set greedySetCover (X,F)
{
U=X;
C=;
while (U !=) {
選擇F中使|S∩U|最大的子集S;
U=U-S;
C=C∪{S};
}
return C;
}
演算法的循環體最多執行min{|X|,|F|}次。而循環體內的計算顯然可在O(|X||F|)時間內完成。因此,演算法的計算時間為O(|X||F|min{|X|,|F|})。由此即知,該演算法是一個多項式時間演算法。

I. 01矩陣,怎麼設計演算法選取最少的行使得列和不等於0

=口=俺、俺才高中,沒學過!我去我怎麼連題都看不懂撞牆.

閱讀全文

與集合覆蓋演算法有序數據相關的資料

熱點內容
迷你世界出編程軟體了 瀏覽:673
res文件夾有哪些 瀏覽:142
交通信號燈單片機課程設計 瀏覽:826
如何測試流媒體伺服器的並發能力 瀏覽:161
溯源碼有分國家認證的嗎 瀏覽:218
如何通過app查詢產檢報告 瀏覽:944
拉結爾安卓手機怎麼用 瀏覽:695
驅動級進程代理源碼 瀏覽:782
androidshape畫線 瀏覽:511
程序員想辭職被拒絕 瀏覽:101
java面試邏輯 瀏覽:749
如何下載全英文app 瀏覽:724
js函數式編程指南 瀏覽:380
為什麼安卓手機相機啟動會卡 瀏覽:341
python中t是什麼意思 瀏覽:765
移動硬碟內存加密 瀏覽:407
單片機測角度 瀏覽:864
URL伺服器地址怎麼填 瀏覽:438
壓縮餅干會導致血糖高嗎 瀏覽:569
cad中xc命令怎麼用 瀏覽:424