浅谈Python实现贪心算法与活动安排问题


Posted in Python onDecember 19, 2017

贪心算法

原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。

如题:给出一组活动,告诉每个活动的开始时间和结束时间,要求出算出能参加的最多活动的数量或者活动的起止时间

贪心算法思路:

用两个数组s,f分别存储活动的起止时间,根据活动的结束时间对活动进行一个非减的活动序列,同样活动的开始时间list也要做对应的调整,这里博主是通过冒泡排序同步交换的,举例:活动(1,4)(2,3)(3,5)那么我们得到的

s = [2,1,3] 
f = [3,4,5]

通过比较下一个活动的开始时间与上一个活动的结束时间的大小关系,确定这两个活动是否是相容的,如果开始时间大于结束时间,则相容,反之不相容,代码如下

#用冒泡排序对结束时间进行排序,同时得到对应的开始时间的list
def bubble_sort(s,f):
  for i in range(len(f)):
    for j in range(0,len(f)-i-1):
      if f[j] > f[j+1]:
        f[j], f[j+1] = f[j+1],f[j]
        s[j],s[j+1] = s[j+1],s[j]
  return s,f

def greedy(s,f,n):
  a = [True for x in range(n)]
  #初始选择第一个活动
  j = 0
  for i in range(1,n):
    #如果下一个活动的开始时间大于等于上个活动的结束时间
    if s[i] >= f[j]:
      a[i] = True
      j = i
    else:
      a[i] = False
  return a

n = int(input())
arr = input().split()
s = []
f = []
for ar in arr:
  ar = ar[1:-1]
  start = int(ar.split(',')[0])
  end = int(ar.split(',')[1])
  s.append(start)
  f.append(end)

s,f = bubble_sort(s,f)
A = greedy(s,f,n)

res = []
for k in range(len(A)):
  if A[k]:
    res.append('({},{})'.format(s[k],f[k]))
print(' '.join(res))

执行结果如下:输入11个活动的起止时间,输出相容的活动的起止时间

浅谈Python实现贪心算法与活动安排问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬虫框架Scrapy安装使用步骤
Apr 01 Python
Python实现的简单算术游戏实例
May 26 Python
python实现识别相似图片小结
Feb 22 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python删除过期log文件操作实例解析
Jan 31 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
python 字符串和整数的转换方法
Jun 25 Python
python pandas写入excel文件的方法示例
Jun 25 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
python 遍历磁盘目录的三种方法
Apr 02 Python
python学习之panda数据分析核心支持库
May 07 Python
Python 全局空间和局部空间
Apr 06 Python
Python实现感知器模型、两层神经网络
Dec 19 #Python
python实现感知器
Dec 19 #Python
python绘制简单折线图代码示例
Dec 19 #Python
matplotlib设置legend图例代码示例
Dec 19 #Python
matplotlib中legend位置调整解析
Dec 19 #Python
python实现感知器算法详解
Dec 19 #Python
python绘制条形图方法代码详解
Dec 19 #Python
You might like
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
php-app开发接口加密详解
2018/04/18 PHP
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
js脚本实现数据去重
2014/11/27 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
详解Python中for循环的使用方法
2015/05/14 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python爬虫超时的处理的实例
2018/12/19 Python
python计算无向图节点度的实例代码
2019/11/22 Python
Python中常见的数制转换有哪些
2020/05/27 Python
找到不普通的东西:Bonanza
2016/10/20 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
入党思想汇报怎么写
2014/04/03 职场文书
禁烟标语大全
2014/06/11 职场文书
村级四风对照检查材料
2014/08/24 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
优秀教师先进材料
2014/12/16 职场文书
高中生综合素质自我评价
2015/03/06 职场文书