活动选择问题|贪婪算法-1

news2024/12/29 9:22:08

贪婪是一种算法范式,它一点一点地构建解决方案,总是选择下一个提供最明显和最直接好处的部分。贪婪算法用于优化问题。
如果优化问题具有以下属性,则可以使用贪婪解决该问题:
在每一步中,我们都可以做出一个目前看起来最好的选择,我们得到了完整问题的最佳解决方案。

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

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

  1. Kruskal最小生成树(MST):
    在Kruskal的算法中,我们通过逐个拾取边缘来创建MST。贪婪选择是在目前构造的MST中选取不引起循环的最小权重边
  2. Prim的最小生成树:
    在Prim的算法中,我们也通过逐个拾取边缘来创建MST。我们维护两套:已经包括在MST中的顶点的集合和尚未包括的顶点的集合。贪婪选择是选择连接两个集合的最小权重边
  3. Dijkstra的最短路径:
    Dijkstra的算法与Prim的算法非常相似。最短路径树是边接边建立的。我们维护两套:一组已经包括在树中的顶点和一组尚未包括的顶点。贪婪选择是选择连接两个集合的边,并且该边位于从源到包含尚未包含的折点的集合的最小权重路径上
  4. 霍夫曼编码:
    霍夫曼编码是一种无损压缩技术。它为不同的字符分配可变长度的位代码。贪婪选择是将最小位长的代码分配给最频繁的字符。

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

在这里,让我们看到一个这样的问题,可以解决使用贪婪算法。

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

示例:

输入:start[] = {10,12,20},finish[] = {20,25,30}
输出:0 2
说明:一个人最多只能做两件事。该可执行的最大活动集是 {0,2} [这些是start[]和finish[]中的索引]
输入:start[] = {1,3,0,5,8,5},finish[] = {2,4,6,7,9,9};
输出:0 1 3 4
说明:一个人最多只能做四种活动。该可执行的最大活动集是 {0,1,3,4} [这些是start[]和finish[]中的索引

方法:
要解决这个问题,请遵循以下思路:

贪婪的选择是总是选择下一个活动,其完成时间在剩余活动中是最短的,并且开始时间大于或等于先前选择的活动的完成时间。我们可以根据活动的完成时间对活动进行排序,这样我们总是把下一个活动视为最短完成时间的活动

按照给出的步骤解决问题:

  • 根据活动的完成时间对活动进行排序
  • 从排序数组中选择第一个活动并打印它
  • 对排序数组中的剩余活动执行以下操作
    如果此活动的开始时间大于或等于先前选定活动的完成时间,则选择此活动并打印它

注意:在实现中,假设活动已经根据它们的完成时间排序。

下面是上述方法的python实现:

# 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)

输出:

Following activities are selected
0 1 3 4 

时间复杂度:O(N)
空间复杂度:O(1)

贪婪选择如何对根据完成时间排序的活动起作用?

假设给定的活动集合为S = {1,2,3,… n},并且活动按完成时间排序。贪婪的选择是总是选择活动1。为什么活动1总是提供最佳解决方案之一?
我们可以证明,如果有另一个解决方案B的第一个活动不是1,那么也有一个解决方案A的大小与活动1相同。设B选择的第一个活动为k,则总是存在A = {B - {k}} U {1}。
注:B中的活动是独立的,并且k在所有活动中具有最小的完成时间。因为k不是1,所以finish(k)>= finish(1))

当给定的活动没有排序时如何实现?

我们为活动创建一个结构/类。我们按完成时间对所有活动进行排序。一旦我们对活动进行了排序,我们就应用相同的算法。
下图是上述方法的说明:
在这里插入图片描述

以下是上述方法的python实现:

''' 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 = "")

输出:

Following activities are selected :
(1, 2), (3, 4), (5, 7), (8, 9)

时间复杂度:O(N log N),如果输入活动可能没排序。排序时是O(N)
空间复杂度:O(1)

使用优先级队列的活动选择问题

按照给出的步骤解决问题:

  • 创建一个优先级队列(Min-Heap)并将活动推入其中。
  • 将优先级队列的顶部推入答案向量,并将变量start设置为第一个活动的开始时间,将变量end设置为活动的完成时间
  • 当优先级不为空时,执行以下操作:
    取优先级队列的最高位置进行检查
    如果此活动的开始时间大于或等于最后选择的活动的完成时间,则将此活动推入答案向量
    否则忽略它
  • 打印存储在答案向量中的所选活动

以下是上述方法的python实现:

# 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)

输出:

Following Activities should be selected. 

Activity started at: 1 and ends at  2
Activity started at: 3 and ends at  4
Activity started at: 5 and ends at  7
Activity started at: 8 and ends at  9

时间复杂度:O(N * log N)
空间复杂度:O(N)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

scrapy学习(scrapy项目学习)

创建scrapy项目 创建爬虫项目 scrapy startproject ss1_miove创建爬虫文件&#xff08;&#xff09; 命令格式&#xff1a;scrapy genspider <爬虫名称> <网站域名> scrapy genspider ss1_scrapy ssr1.scrape.centerscrapy框架的组成 spider文件夹&#xff1a…

ELK之Elasticsearch7.17.4安装(yum方式)和三节点集群配置

一、下载Elasticsearch7.17.4 的rpm包 下载地址&#xff1a; https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-4 二、建立elasticsearch的yum源 vim /etc/yum.repos.d/es.repo [elasticsearch] nameElasticsearch repository for 7.x packages bas…

IO多路复用之poll

文章目录 一&#xff1a;poll函数接口参数说明&#xff1a;返回结果&#xff1a; 二&#xff1a;poll的优缺点优点&#xff1a;缺点&#xff1a; 三&#xff1a;poll代码示例 一&#xff1a;poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, i…

Java设计模式之行为型-模板方法模式(UML类图+案例分析)

目录 一、概念 二、角色设计 三、代码实现 案例一 案例二 四、总结 一、概念 定义一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类当中&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的特定步骤&#xff0c;即在一个抽象类中公开定义了执…

信驰达科技携手TI将CC2340推向更广市场领域

根据蓝牙技术联盟&#xff08;Bluetooth SIG&#xff09;2023年最新发布《2023年蓝牙市场最新资讯》&#xff0c;市调机构ABI Research预测数据显示&#xff0c;蓝牙市场在未来五年将会实现高增长&#xff0c;蓝牙设备年出货量将保持强劲增长势头&#xff0c;预计到2027年将达7…

python高频函数—CSV() 读写

Part.1 csv.reader()函数 csv.reader(csvfile, dialectexcel, **fmtparams) 返回一个 reader 对象&#xff0c;该对象将逐行遍历 csvfile。 一个简短的用法示例: >>> import csv>>> with open(eggs.csv, newline) as csvfile:... spamreader csv.r…

ctrl键的作用

crtl是control的英文缩写&#xff0c;是控制的意思&#xff0c;长和其他键组合起来使用&#xff0c;达到快捷操作的功能。 例如&#xff1a;ctrlX是剪切的功能&#xff0c;ctrlP是打印设置&#xff0c;ctrlZ是撤销&#xff0c;ctrlF是查找&#xff0c;ctrlY是恢复的功能等。 …

在野外使用无线电台的必知事项

电台属于无线通信设备的一种&#xff0c;主要用于发送和接收无线电信号&#xff0c;实现语音、数据和图像等信息的传输。它一般是由发射机和接收机两部分组成&#xff0c;能够在不同的频段和频率上进行通信。通过无线电波传输信息&#xff0c;为人们在不同场景中提供可靠的远距…

11.Rocket解决分布式事务

highlight: arduino-light 两阶段提交协议 原文链接&#xff1a;https://blog.csdn.net/fenglibing/article/details/92417739 两阶段提交协议(Two-phase Commit&#xff0c;2PC)经常被用来实现分布式事务。一般分为协调器TC和若干事务执行者两种角色&#xff0c;这里的事务执行…

【Vue3】学习笔记-ref函数、reactive函数

ref函数、reactive函数 Ref函数reactive函数 Ref函数 作用&#xff1a;定义一个响应式的数据语法&#xff1a;const xxxref(initValue) 创建一个包含响应式数据的引用对象(reference对象&#xff0c;简称ref对象)。JS中操作数据:xxx.value模板中读取数据&#xff1a;不需要.va…

地理数据处理-地理空间表的导入与查询

前言 现在大部分数据库都支持地理空间的数据存储&#xff0c;可以方便的与GIS平台调用&#xff0c;比如Geoserver、ArcGis, 但是如果使用不规范的空间表去发布图层预览可能会出现各种问题&#xff0c;比如坐标系错误&#xff0c;无法聚焦。 本文将举例最常见的SQLServer和Post…

Godot引擎 4.0 文档 - 手册 - 2D

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; 2D — Godot Engine (stable) documentation in English 画布层 视口和画布项目 CanvasItem是所有 2D 节点的基础&#xff0c;无论是常规的 2D 节点&#xff0c;例如…

深入理解微分、积分电路!搞懂PID控制原理就这么简单!

很多朋友觉得PID是遥不可及&#xff0c;很神秘&#xff0c;很高大上的一种控制&#xff0c;对其控制原理也很模糊&#xff0c;只知晓概念性的层面&#xff0c;知其然不知其所以然&#xff0c;那么本期从另类视角来探究微分、积分电路的本质&#xff0c;意在帮助理解PID的控制原…

智慧排水监测系统有什么作用?

随着城市化进程的加速&#xff0c;城市排水系统的压力不断增加。然而&#xff0c;当前城市排水系统面临着管理效率低下、水资源浪费和洪涝灾害等问题。为了解决这些问题&#xff0c;智慧排水监测系统逐渐成为了新的解决方案。本文将为大家详细介绍智慧排水监测系统的作用以及智…

微软公布量子超级计算机路线图

光子盒研究院 6月22日&#xff0c;微软公布了三个重要的量子计算公告。首先&#xff0c;公司宣布它已经实现了通往量子超级计算机的六步路线图的第一个里程碑&#xff0c;并发表了一篇经同行评议的研究论文来证明这一成就。 这家科技巨头的第二项公告是将其人工智能&#xff08…

堆——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容仍旧是二叉树&#xff0c;此刻分享的内容是一种特殊的二叉树&#xff0c;也就是堆了。下面&#xff0c;让我们进入堆的世界吧&#xff01;&#xff01;&#xff01; typedef int HeapDataType; typedef struct Heap {HeapDa…

MES系统是什么?它如何帮助企业提高生产效率?

随着制造业的发展&#xff0c;越来越多的企业开始使用全面的制造执行系统&#xff08;MES&#xff09;来管理其生产过程。那么&#xff0c;MES系统到底是什么呢&#xff1f;它又是如何帮助企业提高生产效率的呢&#xff1f;本文将为大家详细介绍。 一、MES系统的概念 MES系统是…

Leetcode 剑指 Offer II 032. 有效的变位词

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断它们是不…

基于物联网技术的智能配电室综合监控系统设计与产品选型

摘要&#xff1a;配电室是电力系统的重要基础设施&#xff0c;可以保障供配电系统的安全稳定运行。但是&#xff0c;配电室数量多、部署分散、管理复杂&#xff0c;人工现场巡检管理方式费时费工、错误率高&#xff0c;如果发生故障隐患&#xff0c;往往无法及时发现。针对配电…

Sparse Fuse Dense: 向高质量的深度补全3D检测迈进

点云的稀疏性&#xff1a;在远距离和遮挡区域提供的信息较差&#xff0c;导致难以生成精确的3D边界框。 出现了多模态融合。 图像和点云的不同表示方式使得它们难以融合&#xff0c;导致性能不佳。 论文提出了一种新颖的多模态框架SFD&#xff08;Sparse Fuse Dense&#xf…