目录
1.贪心法
1.1.贪心算法概念
贪心算法(Greedy algorithm)是一种基于贪心策略的算法设计方法。在贪心算法中,每一步都选择当前状态下最优的选择,而不考虑全局的最优解。贪心算法通常用于解决优化问题,特别是组合优化问题。
贪心算法的基本思想是通过局部最优选择来达到全局最优。在每一步中,贪心算法选择当前状态下的最优解,并将其添加到解集中。然后,它更新问题的输入,并继续进行下一步。这个过程一直重复,直到达到问题的解。
贪心算法的优点是简单、高效,并且通常易于实现。然而,它并不适用于所有问题,因为贪心策略可能导致得到的解不是全局最优解。在一些情况下,贪心算法可能会得到次优解或根本无法找到解。
要设计一个有效的贪心算法,需要满足贪心选择性质和最优子结构性质。贪心选择性质意味着通过选择局部最优解,可以得到全局最优解。最优子结构性质意味着问题的最优解可以通过子问题的最优解来构造。
贪心算法的应用广泛,例如在图论中的最小生成树问题(如Prim算法和Kruskal算法),在调度问题中的任务调度(如最短作业优先调度算法),以及在背包问题中的分数背包问题等。
需要注意的是,贪心算法并不是解决所有问题的万能方法,有些问题需要使用其他算法来得到最优解。因此,在使用贪心算法时,需要仔细分析问题的特点,并评估算法的适用性和正确性。
1.2.贪心局限
最少硬币问题
硬币面值1、2、5。支付13元,要求硬币数量最少。
贪心用最大面值5往下找到刚好13元
贪心:(1)5元硬币,2个;(2)2元硬币,1个;(3)1元硬币,1个。
硬币面值1、2、4、5、6。支付9元,要求硬币数量最少。
贪心:(1)6元硬币,1个;(2)2元硬币,1个;(3)1元硬币,1个;
错误,正确答案:5元硬币,1个+4元硬币,1个。
正确做法需用到动态规划
1.3.贪心与动态规划对比
贪心法求解的问题需要满足以下特征:
1.最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质,也称此问题满足最优性原理。从局部最优能扩展到全局最优。
2.贪心选择性质:问题的整体最优解可以通过一系列局部最优的选择来得到。
动态规划求解的问题需要满足以下特征:
1.重叠子问题:子问题是原大问题的小版本;计算大问题时需要多次重复计算小问题。
2.最优子结构:大问题的最优解包含小问题的最优解;可以通过小问题的最优解推导出大问题的最优解。
2.拟阵
拟阵理论(Matroid Theory)是一门抽象的数学理论,研究的对象是拟阵。拟阵是一种广义的独立性结构,它推广了向量空间中的线性独立性概念,它是一种组合优化理论。拟阵理论起源于20世纪30年代,由哈西姆·德布斯(Hassler Whitney)和欧根·斯泰费尔(Eugene Steinitz)等人提出和发展。拟阵理论在组合优化、图论、算法设计等领域有广泛的应用。如果问题满足拟阵结构,那么贪心能得到最优解,但一个问题能用贪心解决,这个问题不一定满足拟阵结构。
2.1.什么是拟阵
拟阵由两个基本组成部分构成:基础集合(ground set)和独立集合(independent set)。基础集合是拟阵的元素集合,而独立集合是基础集合的子集,满足一定的性质。在拟阵中,独立集合被认为是不包含冗余元素的集合,类似于线性代数中的线性无关集合。
一个拟阵是满足以下条件的序对M=(S,L):
1.S是一个有穷集合;(例如:S={1,2,3,4})
2.L是S的一个非空子集族,L中的元素称为拟阵的独立集;(例如:上面的S的一个子集为{1,2,3},L={{1},{2},{3},{1,2},{1,3},{2,3}},L中有6个独立集)
3.M满足遗传性:对于独立集B,若B∈L,对于任意AB,有A∈L;(例如:B={2,3},A={2},那么A∈L)
4.M满足交换性:对于任意A∈L,B∈L,且,有某个元素x∈B-A,使得A∪{x}∈L。(例如:A={2},B={2,3},x=5,那么A∪{x}={2,3}∈L)
2.2.拟阵与贪心
把贪心问题转化为求权值最大的独立集
Gready(S,L,w)//拟阵M=(S,L)与权值函数w
A={}//A初始化为空集
sort S//将S内的元素x按权值w(x)从大到小降序排序
for x in S://按从大到小的顺序遍历每一个x∈S
if(A∪{x}∈L)
A=A∪{x}
return A//返回权值最大的独立集