浅谈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服务器与android客户端socket通信实例
Nov 12 Python
python编写的最短路径算法
Mar 25 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Python用户自定义异常的实现
Dec 25 Python
python中random模块详解
Mar 01 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 adodb操作mysql数据库
2009/03/19 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
电子商务自荐书范文
2014/01/04 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
横幅标语大全
2014/06/17 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
治庸问责心得体会
2014/09/12 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
python基础详解之if循环语句
2021/04/24 Python
redis内存空间效率问题的深入探究
2021/05/17 Redis
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
yolov5返回坐标的方法实例
2022/03/17 Python
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS
JavaScript实现简单的音乐播放器
2022/08/14 Javascript