首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

贪心算法(集合覆盖问题)

这个问题就是经典的用贪心算法求解的问题。贪心算法是指在每一步选择中都采取最优的策略,从而希望能够导致结果是最优的一种算法贪心算法所得到的结果并不一定是最优的解,但都是相对接近最优解的结果。...在这32中组合中挑选一种可以覆盖到8个地区,并且广播台最少的组合,那就是本题的解了。 这样做显然很麻烦,要是有100个广播台,那不是完犊子了。但是可以使用贪心算法,提高效率。...贪心算法步骤如下: 遍历所有的广播台,找到一个包含了最多当前还未覆盖地区的广播台; 将这个广播台存起来,想办法把该广播台覆盖的地区中下次选择时,用别的广播台代替; 重复上面的步骤直到覆盖了所有的地区。...将k1用一个ArrayList保存起来; 把k1覆盖的地区从保存地区的集合中去掉,那么现在就只剩下5个地区没覆盖了; 再次遍历广播台的集合,现在剩下5个地区未覆盖,即广州、深圳、成都、杭州、大连。...按照遍历顺序,选择k2; 再把k2覆盖的地区从保存地区的集合中去掉,那么现在就剩下成都、杭州、大连三个地方未覆盖了; 遍历广播台集合,发现k3和k5都可以覆盖两个,按照遍历顺序,选择k3; 再把k3覆盖的地区从保存地区的集合中去掉

1.2K20

使用贪心算法解决集合覆盖问题

在《算法图解》里面有一个蛮有意思的小案例,背景是一个广播节目,要让全美的50个周的听众都能够听到,但是每个电台可能覆盖多个州,每在一个电台播出就需要一笔费用,所以就是从成本的角度来看,怎么尽可能在所有的州都播出...,这是一个典型的集合覆盖的问题,而且在我们的生活中算是比较典型。...比如我们先缩小范围,指定5个州,那么50个州也是同样的算法。...如何使用贪心算法呢,就是选择覆盖尽可能多的州的电台,然后逐步缩小范围。那么覆盖面广的州所对应的电台就优先被选中,依次类推。...当然贪心算法得到的不是精确的结果,即可能不是最优解,算是一种近似算法,能够基本得到的最优解,而且效率很高。

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

随机增量算法 - 最小覆盖

文章整理自网络 简介 随机增量算法是计算几何的一个重要算法,它对理论知识要求不高,算法时间复杂度低,应用范围广大。...最小覆盖问题 题意描述 在一个平面上有n个点,求一个半径最小的圆,能覆盖所有的点。 算法 假设圆O是前i-1个点得最小覆盖圆,加入第i个点,如果在圆内或边上则什么也不做。...(因为最多需要三个点来确定这个最小覆盖圆,所以重复三次) 遍历完所有点之后,所得到的圆就是覆盖所有点的最小圆。...S的最小覆盖圆内,则p一定在SU{p}的最小覆盖圆上。...令前i-1个点的最小覆盖圆为C 如果第i个点在C内,则前i个点的最小覆盖圆也是C 如果不在,那么第i个点一定在前i个点的最小覆盖圆上,接着确定前i-1个点中还有哪两个在最小覆盖圆上。

1.7K30

精读《算法题 - 最小覆盖子串》

今天我们看一道 leetcode hard 难度题目:最小覆盖子串。 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。...示例 1: 输入:s = "ADOBECODEBANC", t = "ABC" 输出:"BANC" 解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。...因为最小覆盖子串是连续的,所以该方法可以保证遍历到所有满足条件的子串。...总结 该题首先要排除动态规划,并根据连续子串特性第一时间想到滑动窗口可以覆盖到所有可能性。...讨论地址是:精读《算法 - 最小覆盖子串》· Issue #496 · dt-fe/weekly 如果你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

18440

贪心算法(四)——最小代价生成树

这就是一个最小代价生成树的问题,可以用Prim算法或kruskal算法解决。 PS1:无向连通图的生成树是一个极小连通子图。 PS2:生成树是图的一个子图,包括所有的顶点和最少的边(n-1条边)。...PS3:最小代价生成树就是所有生成树中权值之和最小的那个。 算法思路 算法的目标很明确,就是要在n个节点的图中,找出n-1个节点,并且节点之间连线的权值是最小的。...,其中选边方式(贪心准则)的不同,就产生不同的最小代价生成树算法。...Map> Prim算法 贪心准则:将整个图分成两部分,一部分已选入生成树,另一部分在生成树之外。...Kruskal算法 贪心准则:将所有的边按照权值递增的顺序排序,每次选一条权值最小的边纳入生成树中,若没有环路则选边成功,若有环路,则选下一条次小的边,直到选满n-1条边为止。

2.9K60

使用贪心算法解决最小生成树

树的定义:连接的无环图 直接策略 找到所有的生成树,然后计算权重最小的 image.png image.png 贪心算法的性质 最优子结构:有多个子结构的最优解最终组成整个问题的最优解 贪心算法的选择特定...算法 核心思想:全局最小的corssing cut边必定属于最小生成树,这个过程不能生成环,需要追踪两个节点是否已经互相连接了 追踪的数据结构是 Union-Find 结构,包含3个功能,Make-Set...:创建一个集合;Find-Set:找到当前元素在那个集合;Union:合并集合 刚开始的时候T什么都没有 对每个节点v都执行一遍Make-Set 为了找到全局最小的crossing cut,对整个的边通过权值按照递增来排序...按照增序遍历所有的边,如果两个节点u和v属于不同的集合(crossing cut),那么可以合并边T=TU{e},然后将这两个集合合并Union(u,v) 延伸阅读 Union-Find数据结构与Ackermann...O(E),整体不Prims算法要好 最快的MST 算法运行期望时间是O(V+E),Karger, Klein, and Tarjan 1993发明

1.2K40

最小生成树之Prim贪心算法

设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合...U-V中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。...因为有N个顶点,所以该MST就有N-1条边,每一次向集合V中加入一个点,就意味着找到一条MST的边。 ? ? ? ? ? ?...in >> i >> j >> cost;           graph[i][j] = cost;           graph[j][i] = cost;       }       //求解最小生成树...       cost = prim(graph, m);       //输出最小权值和       cout << "最小权值和=" << cost << endl;       system("pause

61110

算法图解》第八章_贪婪算法_集合覆盖问题

每个广播台都覆盖特定的区域,不同广播台的覆盖区域可能重叠。 ? 如何找出覆盖全美个州的最小广播台合集呢?下面是解决步骤: 列出每个可能的广播台集合,这被称为幂集(power set)。...在这些集合中,选出覆盖全美50个州的最小集合。 那么问题来了,计算每个可能的广播台子集需要很长的时间。 ? 我们可以尝试使用贪婪算法。...三、算法实现 算法步骤 选出这样一个广播台,即它覆盖了最多未覆盖的州。即便这个广播台覆盖了一些已覆盖的州(就是重复覆盖),也没有关系。 重复第一步,直到覆盖了所有的州。...while states_needed: best_station = None # 将覆盖了最多的未覆盖州的广播台存储进去 states_covered = set() # 一个集合,包含该广播台覆盖的所有未覆盖的州...五、代码部分解读 在上述算法中,有一段代码很有趣 covered = states_needed & states # 计算交集 它是用来进行集合之间的相关计算,在此介绍下并集、交集和差集 并集意味着将集合合并

2.1K70

贪心算法如何贪心

在前面学习最短路径和最小生成树的时候,我们发现Dijkstra算法,Prim算法,Kruskal算法都是属于典型的贪心算法应用。...这篇文章就是对于贪心算法的入门介绍 贪心算法 贪心算法(又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。...既然策略只有一种,且是用给定的数去组成一个新的最小的数,那么运用贪心算法之前,我们需要考虑每一步组装新值所选取的数据如果是符合规定的最小值, 那么能不能保证最终的数值是最小的。...这里显而易见,每一步的首位数字是符合规定的最小值,那么最终组成的数据也是最小的(可以使用数学归纳法证明)。所以使用贪心算法是可以的。...只要能满足贪心算法的两个性质: 贪心选择性质和最优子结构性质,贪心算法就可以出色地求出问题的整体最优解。即使某些问题,贪心算法不能求得整体的最优解,贪心算法 也能求出大概的整体最优解。

1K10

算法贪心算法

贪心算法 概念解释 贪婪算法(贪心算法)是指在对问题求解的时候,每一步选择都采用最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。...贪心算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。 贪心算法并没有固定的解发框架,算法的关键是贪心策略的选择,根据不用问题选择不同的策略。...解题思路: 用贪心算法的思想,每一步都用能用的最大纸币即可。...会提示找不开,这种情况下我们使用贪心算法得到的答案就不是最优解,因为我们一直在尝试用最大的纸币来尽可能的使用最少的张数来解决问题。这就不是最优的。 贪心算法没有固定的框架,关键是看你怎么选择。...这种情况就需要调整策略,甚至,就不适用贪心算法贪心算法是尽力找到近似的最优解,注重的是速度,不是精准度,并不是说一定能找到合适的解,或是一定能找到解 。 对应问题根据情况不同选择合适的算法解决。

20930

贪心算法

贪心算法:分阶段的工作,在每个阶段做出当前最好的选择,从而希望得到结果是最好或最优的算法贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。...阶段性:每个区间选择那两个点 贪心策略:   对于所有的区间按右端点从小到大排序。(根据右端点排序)   从第一个区间开始扫描是否覆盖了两个点?...扫描下一个:从右断点覆盖,直到覆盖两个点;(从左端扫描,右端覆盖) 1 #include 2 #include 3 #include ...:将最小的非0数字作为x的最高位,然后依次从左往右取k位加入x,从右往左取k位作为y,x-y的绝对值即为答案。...56 */ 最近做了一些贪心算法的题,感觉贪心算法主要是根据问题的要求想出贪心策略,上面提到了没有涉及到什么数据结构和高精度的问题。所以用到最多的就是排序。

51930
领券