python 贪心算法(Greedy Algo)

        贪婪是一种算法范式,它逐步构建解决方案,始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 

如果问题具有以下属性,则可以使用贪心法解决优化问题: 

        每一步,我们都可以做出当前看来最好的选择,从而得到整个问题的最优解。 

        如果贪婪算法可以解决某个问题,那么它通常会成为解决该问题的最佳方法,因为贪婪算法通常比动态规划等其他技术更有效。但贪婪算法并不总是适用。例如,Fractional Knapsack问题可以使用Greedy来解决,但是0-1 Knapsack问题不能使用Greedy来解决。

以下是一些贪婪算法的标准算法:

1)Kruskal的最小生成树(MST): 
        在 Kruskal 算法中,我们通过一条一条地选取边来创建 MST。贪心选择是选择在目前构建的 MST 中不会引起循环的最小权重边

2)Prim的最小生成树: 
        在 Prim 的算法中,我们也是通过逐条选取边来创建 MST。我们维护两个集合:一组已包含在 MST 中的顶点和一组尚未包含的顶点。贪心选择是选择连接两个集合的最小权重边

3)Dijkstra的最短路径: 
        Dijkstra 算法与 Prim 算法非常相似。最短路径树是逐边构建的。我们维护两个集合:一组已包含在树中的顶点和一组尚未包含的顶点。贪心选择是选择连接两个集合并且位于从源到包含尚未包含的顶点的集合的最小权重路径上的边

4)霍夫曼编码: 
        霍夫曼编码是一种无损压缩技术。它将可变长度位代码分配给不同的字符。贪心选择是将最小位长的代码分配给最常见的字符。

        贪心算法有时也用于获得硬优化问题的近似值。例如,旅行商问题是一个 NP 难问题。这个问题的贪婪选择是每一步都选择距离当前城市最近的未访问过的城市。这些解决方案并不总是产生最佳的最优解决方案,但可用于获得近似最优的解决方案。

这里让我们看一个可以使用贪心算法解决的问题

问题:
        您将获得n项活动及其开始和结束时间。选择一个人可以执行的最大活动数,假设一个人一次只能从事一项活动。 

例子:  

输入: start[] = {10, 12, 20}, finish[] = {20, 25, 30}
输出: 0
解释:一个人最多可以执行一项活动。

输入: start[] = {1, 3, 0, 5, 8, 5}, finish[] = {2, 4, 6, 7, 9, 9};
输出: 0 1 3 4
解释:一个人最多可以执行四项活动。
可以执行的最大活动集 是 
{0, 1, 3, 4} [ 这些是 start[] 和 finish[] 中的索引

方法:要解决该问题,请遵循以下想法:

        贪心选择是总是选择剩余活动中完成时间最短的下一个活动,并且开始时间大于或等于先前选择的活动的结束时间。我们可以根据活动的完成时间对活动进行排序,以便我们始终将下一个活动视为完成时间最短的活动

请按照给定的步骤解决问题:

1、根据活动的完成时间对活动进行排序 
2、从排序数组中选择第一个活动并打印它 
3、对排序数组中的剩余活动执行以下操作
4、如果此活动的开始时间大于或等于先前选择的活动的结束时间,则选择此活动并打印
注意:在实现中,假设活动已经按照完成时间排序,否则时间复杂度将上升到 O(N*log(N)),辅助空间将上升到 O(N),因为我们必须创建一个二维数组来将开始时间和结束时间存储在一起。

下面是上述方法的实现。 

# Python3 program for activity selection problem. 
  
# The following implementation assumes that the activities 
# are already sorted according to their finish time 
  
# Prints a maximum set of activities that can be done  
# by a single person, one at a time 
def printMaxActivities(s, f): 
    n = len(f) 
    print("Following activities are selected") 
  
    # The first activity is always selected 
    i = 0
    print(i, end=' ') 
  
    # Consider rest of the activities 
    for j in range(1, n): 
  
        # If this activity has start time greater than 
        # or equal to the finish time of previously 
        # selected activity, then select it 
        if s[j] >= f[i]: 
            print(j, end=' ') 
            i = j 
  
  
# Driver code 
if __name__ == '__main__': 
    s = [1, 3, 0, 5, 8, 5] 
    f = [2, 4, 6, 7, 9, 9] 
  
    # Function call 
    printMaxActivities(s, f) 
  
# This code is contributed by Nikhil Kumar Singh  

输出
选择以下活动
0 1 3 4
时间复杂度: O(N)
辅助空间: O(1)

贪婪选择如何适用于根据完成时间排序的活动? 
        假设给定的活动集为 S = {1, 2, 3, …n},活动按完成时间排序。贪婪选择总是选择活动 1。为什么活动 1 总是提供最佳解决方案之一?

        我们可以通过证明如果存在另一个解 B 且第一个活动不是 1,则也存在一个与活动 1 大小相同的解 A 作为第一个活动。设B选择的第一个活动为k,则总存在A = {B – {k}} U {1}。

注: B 中的活动是独立的,并且 k 的完成时间是所有活动中最小的。由于 k 不为 1,所以 finish(k) >= finish(1))

当给定的活动未排序时如何实施? 
        我们为活动创建一个结构/类。我们按完成时间对所有活动进行排序(请参阅C++ STL 中的排序)。一旦我们对活动进行排序,我们就应用相同的算法。

下图是上述方法的说明: 

下面是上述方法的实现:

''' Python program for activity selection problem 
 when input activities may not be sorted.'''
  
  
def MaxActivities(arr, n): 
    selected = [] 
  
    # Sort jobs according to finish time 
    Activity.sort(key=lambda x: x[1]) 
  
    # The first activity always gets selected 
    i = 0
    selected.append(arr[i]) 
  
    for j in range(1, n): 
  
        '''If this activity has start time greater than or 
           equal to the finish time of previously selected 
           activity, then select it'''
        if arr[j][0] >= arr[i][1]: 
            selected.append(arr[j]) 
            i = j 
    return selected 
  
  
# Driver code 
if __name__ == '__main__': 
    Activity = [[5, 9], [1, 2], [3, 4], [0, 6], [5, 7], [8, 9]] 
    n = len(Activity) 
  
    # Function call 
    selected = MaxActivities(Activity, n) 
    print("Following activities are selected :") 
    print(selected[0], end = ""); 
    for i in range (1, len(selected)): 
        print(",", end = " ") 
        print(selected[i], end = "") 
  
# This code is contributed by kshitijjainm  

输出
选定以下活动:
(1、2)、(3、4)、(5、7)、(8、9)
时间复杂度: O(N log N),如果输入活动可能无法排序。当输入活动始终排序时,需要 O(n) 时间。
辅助空间: O(1)

使用优先级队列的活动选择问题:
我们可以使用 Min-Heap 来获取完成时间最短的活动。Min-Heap 可以使用优先级队列实现

请按照给定的步骤解决问题:

1、创建优先级队列(最小堆)并将活动推入其中。
2、将优先级队列的顶部推入答案向量,并将变量start设置为第一个活动的开始时间,将变量end 3、设置为该活动的结束时间
4、当优先级不为空时,执行以下操作:
        4.1、取出优先级队列的顶部并检查
        4.2、如果此活动的开始时间大于或等于最后选择的活动的结束时间,则将此活动推入答案向量
        4.3、不然就忽略它
 5、打印选择的活动,存储在答案向量中

下面是上述方法的实现: 

# Python3 program for activity selection problem 
# when input activities may not be sorted. 
from heapq import heappop, heappush 
  
# Function to select activites 
  
  
def SelectActivities(s, f): 
    ans = [] 
    p = [] 
  
    # Pushing elements in the list 
    for i, j in zip(s, f): 
        heappush(p, (j, i)) 
  
    it = heappop(p) 
    start = it[1] 
    end = it[0] 
    ans.append(it) 
  
    # Sorting process 
    while p: 
        it = heappop(p) 
        if it[1] >= end: 
            start = it[1] 
            end = it[0] 
            ans.append(it) 
  
    print("Following Activities should be selected.\n") 
    for f, s in ans: 
        print(f"Activity started at {s} and ends at {f}") 
  
  
# Driver code 
if __name__ == "__main__": 
    s = [1, 3, 0, 5, 8, 5] 
    finish = [2, 4, 6, 7, 9, 9] 
  
    # Function call 
    SelectActivities(s, finish) 
  
# This code is contributed by kraanzu.  

输出
应选择以下活动。

活动开始于:1 结束于:2
活动开始于:3 结束于:4
活动开始于:5 结束于:7
活动开始于:8 结束于:9
时间复杂度: O(N * log N)
辅助空间: O(N) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/675341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

教务管理系统带万字文档基于springboot+vue的校务管理系统java项目

文章目录 教务管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 教务管理系统 一、项目演示 校务管理系统 二、项目介绍 基于springbootvue的前后端分离教…

强大的机器学习建模扩展包:mlxtend

公众号:尤而小屋编辑:Peter作者:Peter 大家好,我是Peter~ 今天给大家介绍一个强大的机器学习建模扩展包:mlxtend。 mlxtend(machine learning extensions,机器学习扩展)是一个用于日常数据分析、机器学习…

程序员应该有什么职业素养?

程序员的六大职业素养:构建成功职业生涯的基石 在不断变化的技术世界中,程序员不单要保持技术的锋利,也需要培养相应的职业素养,这些素养在很大程度上决定了一个程序员的职业生涯能否走得长远。以下是我认为最为重要的六大职业素…

2024上海国际金属去毛刺表面精加工技术展览会

2024上海国际金属去毛刺表面精加工技术展览会 2024 Shanghai International Metal Deburring Surface Finishing Technology Exhibition 时间:2024年12月18日--20日 地点:上海新国际博览中心 详询主办方陆先生 I38(前三位) …

gorm/gin框架实战

gorm/gin框架实战 项目简介 学习源视频:【最新Go Web开发教程】基于gin框架和gorm的web开发实战 (七米出品)_哔哩哔哩_bilibili 本博客为我的学习笔记。 项目目标:实现一个备忘录工具(当然不支持alert),仅仅是可以记录待办事项。 实现了…

Linux基础1-基本指令3

上篇文章我们说到了文件,pwd,touch,mkdir等知识。 Linux基础1-基本指令2(你真的了解文件吗?)-CSDN博客 本文继续梳理其他基础命令 1.本章重点 1.删除一个空目录命令rmdir 2.删除一个文件指令rm(重要!) 3.man命令&am…

Gradle下载慢的问题解决

把gradle地址前面的部分改一下就行,下载就快多了 改成这个地址: https://mirrors.aliyun.com/macports/distfiles/gradle/ 这个是gradle的阿里云镜像下载地址,在国内下载起来很快 如何改地址: 找到路径 项目/app/gradle/wrappe…

养老产业能否成为国家经济的新支柱?

养老产业,随着人口老龄化的加剧,逐渐成为国家经济的新支柱。在中国,老年人口的快速增长已经引起了社会的广泛关注,这也带动了对养老服务和健康医疗需求的持续增加。 政府也在积极应对这一挑战,出台了一系列政策来支持…

理解与应用排序算法(快速排序C实现)

目录 一、排序的定义 二、内排序方法 三、插入排序 3.1 直接插入排序 3.1 折半插入排序 3.1 链表插入排序 四、交换排序 五、起泡排序 六、快速排序 一、排序的定义 稳定排序和非稳定排序 设文件f(R1......Ri......Rj......Rn)中记录Ri、Rj(i≠j&#xff0…

TMS320F280049 ECAP模块--应用(2)

例1-上升沿触发 如下图所示,evt1-4设置为上升沿触发,在每个上升沿ctr值依次加载到cap1-4. 例2-上升下降沿触发 每个边沿都可选为事件,每次事件到来,依次把ctr加载到cap1-4。 例3-差异模式下上升沿触发 差异模式下每次事件到来时…

varchar 字段扩展问题

背景 近期接到一个产品需求,由于上游业务字段扩大了字段,下游的字段也得跟着调整扩大,这就涉及几十张大表,十几亿行数据的变更。 如果按照传统方式 onlie-ddl 借用第三方工具也得三四天分批跑,看了看MySQL官网&#…

ctfshow-web入门-爆破(web25)及php_mt_seed工具的安装与使用

爆个🔨,不爆了 hexdec() 函数用于将十六进制字符串转换为十进制数; 注意: 我最开始做这道题时看错了,误以为随机数的种子直接来自于 flag 的前八位,以为就是 ctfshow{ 这八个字符然后 md5 加密再截取&a…

使用jquery.mousewheel-3.0.6.pack.js时报错

基于1.12.4版本的jquery.min.js,在使用jquery.mousewheel-3.0.6.pack.js时报错了: 可以如下解决: addEventListener事件里要加上{ passive: false },这样就可以在使用鼠标滚轮放大缩小图片时,就不会报上述的错误了。 …

VsQt单元测试目录的管理方式

正常项目的文件管理方式 正常项目的目录,是由文件系统中实际的文件夹进行分类管理的。 但是如果单元测试用实际文件夹管理的话,会出现问题,就是被测类太多了,用文件系统管理的话,不太方面查看,如下图所示。…

7EPhone云手机各功能详解

上篇文章详细介绍了7EPhone云手机的注册和购买(没看到的同学可以自主去翻看一下哈~),这篇文章主要给大家讲解7EPhone作为专业海外社媒营销工具,界面上显示什么信息,云机到底有什么功能,这些功能具体怎么来使…

招聘兼职发布客服的骗局大揭秘

在现今的互联网社会中,线上兼职成为许多人追求额外收入或灵活就业的方式。然而,这其中也隐藏着不少骗局,在各大招聘网站或者招聘软件上的今日头条兼职客服招聘就是其中之一。本文将详细揭露这种骗局的运作方式,以帮助大家识别和防…

对比WPF和Avalonia的边框渲染差异

众所周知&#xff0c;诸如Border、Rectangle等元素&#xff0c;是具有边框的。但在WPF和Avalonia中&#xff0c;边框的渲染机制有所不同。 如下代码&#xff0c;Border的边框和背景色均为黑色&#xff0c;并且将透明度设为0.5&#xff1a; <Border Width"100" H…

知了汇智携手数字经济商会,共促物联网鸿蒙产教融合新篇章

5月31日&#xff0c;由成都市数字经济商会主办&#xff0c;华为技术有限公司协办&#xff0c;成都知了汇智科技有限公司及成都市数字经济商会人才专委会共同承办的“产教融合物联网鸿蒙人才交流”大会在成都天府软件园产教融合基地隆重举办。 会议旨在加速四川省鸿蒙技术产业的…

Transformer详解(3-1)-attention为什么要除以根号d

attention的计算公式&#xff0c;为什么要除以根号d? 参考 NLP面试官&#xff1a;“Attention为什么要除以根号d” 算法女生这么回答当场想发 offer

【轻触按键】终篇 -- 纯硬 VS 复合

1、选型 2、开关机电路–填坑1 3、开关机电路–填坑1.a 4、开关机电路–复合芯片解决方案 填坑2 总结 上述几篇&#xff0c;基本上都是比较靠谱的硬件方案&#xff1b; ①所有开关均关闭&#xff1b; X1灯亮&#xff1b;P-MOS 管Q1关断&#xff1b; 特别注意&#xff0c;…