動歸、貪心、分治、回溯
填空題
-
解決0/1背包問題可以使用動態規划、回溯法和分支限界法,其中不需要排序的是 動態規划,需要排序的是回溯法,分支限界法。
-
利用分支界限法實現算法設計時,通常采用 堆 實現來構造優先隊列。
-
優先隊列式分支界法選取擴展結點的依據是 結點的優先級
-
隊列式分支限界法:將活結點組織成為一個隊列,並按照隊列先進先出的原則選取下一個結點作為擴展節點。
優先隊列式分支限界法:將活結點組織成一個優先隊列,並選取優先級最高的結點作為擴展結點。
活結點:自身已經生成但是孩子結點沒有全部生成的結點
擴展結點:正在產生孩子的結點
-
-
分支限界法的求解目標是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優解。
-
分支界限法和回溯法主要區別在於 求解目標和搜索方式不同。
回溯法:
(1)求解目標:找出解空間中滿足約束條件的所有解
(2)搜索方式:深度優先搜索
分支限界法:
(1)求解目標:在解空間中找到滿足約束條件的最優解
(2)搜索方式:廣度優先搜索
-
以廣度優先或以最小耗費方式搜索問題解的算法稱為 分支限界法 。
-
回溯法和分支限界法 在搜索解空間樹的時候,為了避免無效搜索,通常使用剪枝策略來提高搜索效率。
避免無效搜索的方法,常用的兩種剪枝函數為 約束函數 和 限界函數 。
(1)約束函數:減去不滿足約束的子樹
(2)限界函數:剪去得不到解或最優解的子樹
-
分支界限法和回溯法分別用廣度優先遍歷或者最小耗費優先、深度優先的方式搜索解空間樹。
-
用回溯法解0/1背包問題時,該問題的解空間結構為 子集樹 結構。問題的解空間樹常見的有子集樹、排列樹兩種類型。
子集樹:所給的問題是從n個元素的集合中找到滿足某種性質的子集。
排列樹:所給的問題是從n個元素滿足某種性質的排列時相應的解空間樹。
-
若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},序列X和Y的最長公共子序列是{BABCD}或{CABCD}或{CADCD}
字符序列的子序列是指:從字符序列中隨意地去掉若干個字符后形成的字符序列。
-
動態規划算法的兩個基本要素是 最優子結構 性質和 重疊子問題 性質 。
-
動態規划算法的基本思想是將待求解問題分解成若干 子問題 ,先求解 子問題 ,然后從這些 子問題 的解得到原問題的解。
動態規划的三個性質:
(1)最優子結構:問題的最優解所包含的子問題也是最優的。
(2)無后效性:某狀態以后的過程不會影響以前的狀態。
(3)有重疊子問題:子問題之間是不獨立的,一個子問題在下一階段的決策中可能會被多次使用。(分治法的子問題是相互獨立的)
-
問題的最優子結構性質 是該問題可用動態規划算法和貪心算法求解的關鍵特征。
貪心算法基本要素:
(1)貪心選擇性質:每一步所做的貪心選擇最終導致問題的整體最優解。
(2)最優子結構性質:一個問題的最優解包含其子問題的最優解。
而動態規划也具有最優子結構性質。
-
貪心法的基本思路是在對問題求解時總是做出在當前看來是最好的選擇,也就是說貪心法不從整體最優上加以考慮,所做出的僅是在某種意義上的局部最優解。
-
大整數乘積算法是用 分治法 來設計的。
-
快速排序算法的性能取決於 划分的對稱性
-
分治法通常采用遞歸算法設計技術,在每一層遞歸上都有3個步驟:分解、求解子問題、合並。
-
冒泡排序算法屬於窮舉法 (兩層for循環)
-
直接采用窮舉法設計算法中,主要是使用 循環語句 和 選擇語句,循環語句用於窮舉所有可能的情況,而選擇語句判定當前的條件是否為所求的解。
-
當設定的問題有多種算法去解決時,其選擇算法的主要原則是 選擇其中復雜性最低者。
-
任何可用計算機求解的問題所需的時間都與其 規模 有關。
選擇題
- 分治法的設計思想是將一個難以直接解決的大問題分割成規模較小的子問題,分別解決子問題,最后將子問題的解組合起來形成原問題的解。這要求原問題和子問題(C)。
A.問題規模相同,問題性質相同
B.問題規模相同,問題性質不同
C.問題規模不同,問題性質相同
D.問題規模不同,問題性質不同
- Strassen矩陣乘法是利用( A )實現的算法。
A.分治策略 B.動態規划法 C.貪心法 D.回溯法
- 使用分治法求解不需要滿足的條件是( A )。
A.子問題必須是一樣的
B.子問題不能夠重復
C.子問題的解可以合並
D.原問題和子問題使用相同的方法解規模改變,問題性質不變
- 實現大整數的乘法是利用的算法( C )
A.貪心法 B.動態規划法 C.分治策略 D.回溯法
- (C)是貪心算法的基本要素。
A.重疊子問題 B.構造最優解 C.貪心選擇性質 D.定義最優解
- 背包問題的貪心算法所需的計算時間為(B)
A.O(n2^n) B.O(nlog2n) C.O(2n) D.O(n)
/*
問題描述:與0 / 1背包問題不同的是,完全背包問題可以裝入一部分物品進入背包,也就是說背包一定可以裝滿。
方案:將物品以單位價值從大到小排序,除最后一個物品只取一部分之外,其他物品要么全拿,要么不拿
時間復雜度:快速排序(Onlog2n)
*/
- 以下不屬於貪心算法的是( D)
A.Prim算法 B.Kruskal算法 C.Dijkstra算法 D.深度優先遍歷
//深度優先遍歷: 回溯,走不通的時候回溯
- 下面問題( B )不能使用貪心法解決。
A.單源最短路徑問題
B.N皇后問題
C.最小生成樹問題
D.背包問題
- 一個問題可用動態規划算法或貪心算法求解的關鍵特征是問題的( C)
A.貪心選擇性質 B.重疊子問題 C.最優子結構性質 D.定義最優解。
- 下列算法中不能解決0/1背包問題的是(A)
A.貪心法 B.動態規划 C.回溯法 D.分支限界法
- 貪心算法與動態規划算法的主要區別是( B )。
A、最優子結構 B、貪心選擇性質 C、構造最優解 D、定義最優解
/*
貪心算法基本要素:
(1)貪心選擇性質:每一步所做的貪心選擇最終導致問題的整體最優解。
(2)最優子結構性質:一個問題的最優解包含其子問題的最優解。
而動態規划也具有最優子結構性質。
*/
- 動態規划算法的基本要素為( C )
A.最優子結構性質與貪心選擇性質
B.重疊子問題性質與貪心選擇性質
C.最優子結構性質與重疊子問題性質
D.預排序與遞歸調用
- 關於回溯法以下敘述中不正確的是(C)。
A.回溯法有“通用解題法”之稱,它可以系統地搜索一個問題的所有解或任意解
B.回溯法是一種既帶系統性又帶有跳躍性的搜索算法
C.回溯算法需要借助隊列這種結構來保存從根結點到當前擴展結點的路徑
D.回溯算法在生成解空間的任一結點時,先判斷該結點是否可能包含問題的解,如果肯定不包含,則跳過對該結點為根的子樹的搜索,逐層向祖先結點回溯
//C: 借助於樹結構
- 下列算法中通常以深度優先方式系統搜索問題解的是( D )。
A.備忘錄法 B.動態規划法 C.貪心法 D.回溯法
//回溯法:深度優先
//分支限界法:廣度優先
- 下面哪種函數是回溯法中為避免無效搜索采取的策略( B )。
A.遞歸函數 B.剪枝函數 C.隨機數函數 D.搜索函數
/*
避免無效搜索的方法:
(1)約束函數:減去不滿足約束的子樹
(2)限界函數:剪去得不到解或最優解的子樹
*/
- 0-1背包問題的回溯算法所需的計算時間為( C )
A.O(n^2) B.O(nlogn) C.O(2^n) D.O(n)
- 最大效益優先是( A )的一搜索方式。
A.分治策略 B.動態規划法 C.貪心法 D.回溯法
- 下面不是分支界限法搜索方式的是( D )。
A.廣度優先 B.最小耗費優先 C.最大效益優先 D.深度優先
//回溯法:深度優先
//分支限界法:廣度優先
- 分支限界法解0/1背包問題時,優先級隊列的組織形式是( B )。
A.小根堆 B.大根堆 C.棧 D.循環鏈表
/*
最大優先隊列:大根堆
最小優先隊列:小根堆
隊列式分支限界法:隊列
*/
- 優先隊列式分支限界法選取擴展結點的原則是( C )。
A.先進先出 B.后進先出 C.結點的優先級 D.隨機
// 選取優先級最高的結點作為當前的擴展結點。
代碼題
- 漢諾塔問題
void Hanoi(int n, int A,int B,int C){
if(n>0){
Hanoi (n-1,A,C,B);
Move(n,a,b);
Hanoi(n-1,C,B,A);
}
}