【算法设计与分析】— —实现活动安排问题的贪心算法。

🎃欢迎大家前去观看我的算法设计与分析专栏: 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助!


🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯目的:

🎯内容:

 🎯代码(C语言):

🎯运行结果:

🎯 算法分析:

🎯其他程序语言的实现:

🎐Java程序:

🎐 python程序:

🎐C++程序:


🎯目的:

1)了解贪心算法思想及基本原理;

2)掌握使用贪心算法求解问题的一般特征;

3)能够针对实际问题,能够正确选择贪心策略;

4)能够针对选择的贪心策略,证明算法的正确性;

5)能够根据贪心策略,正确编写代码;

6)能够正确分析算法的时间复杂度和空间复杂度。

🎯内容:

实现活动安排问题的贪心算法。

测试数据可选用:

i

1

2

3

4

5

6

7

8

9

10

Begin

1

3

2

5

3

5

6

8

8

2

End

4

5

6

7

8

9

10

11

12

13

 🎯代码(C语言):

#include <stdio.h>
void activity(int start [],int end[],int n){int result[n];//结果数组,存储选中的活动编号int prev_end_time=-1;//上一个已选中的活动编号的结束时间int count =0;//记录已选中的活动数量for(int i=0;i<n;i++){int start_time=start[i];int end_time=end[i];if(start_time >=prev_end_time){result[count]=i;//将活动编码放入结果数组中prev_end_time=end_time;count++; }} printf("活动安排的编码顺序为:"); for(int i=0;i<count;i++){printf("%d ",result[i]+1);//注意活动编号从1号开始 } printf("\n"); 
}
int main(){int start1[]={1,3,2,5,3,5,6,8,8,2};int end1[]={4,5,6,7,8,9,10,11,12,13};activity(start1,end1,10);return 0;
}

🎯运行结果:

🎯 算法分析:

当储存n个对象时

1.时间复杂度分析:

  • void activity(int start [],int end[],int n)函数中使用了一个循环,循环次数为n。
  • 循环内部使用常数时间执行操作(比较、赋值等),时间复杂度为O(1)。
  • 因此,void activity(int start [],int end[],int n)函数的时间复杂度为O(n)。

综上所述:整段代码在存储n个对象时的时间复杂度为O(n)。

2.空间复杂度分析:

  • void activity(int start [],int end[],int n)函数中定义了一个大小为n的整型数组result[],用于存储选中的活动编号。因此,该数组的空间复杂度为O(n)。
  • 另外,函数中还定义了几个整型变量,它们的空间复杂度为O(1)。

综上所述,整段代码在存储n个对象的空间复杂度为O(n)。

        需要注意的是,以上的复杂度分析假设输入规模为n,表示活动的数量。如果活动数量很大,复杂度可能会随之增加。

🎯其他程序语言的实现:

以下代码均有ai生成,读者如发现bug可以发在评论区,咱们一起解决❤️!

🎐Java程序:

public class ActivitySelection {public static void activity(int[] start, int[] end, int n) {int[] result = new int[n]; // 结果数组,存储选中的活动编号int prevEnd = -1; // 上一个已选中的活动编号的结束时间int count = 0; // 记录已选中的活动数量for (int i = 0; i < n; i++) {int startTime = start[i];int endTime = end[i];if (startTime >= prevEnd) {result[count] = i; // 将活动编码放入结果数组中prevEnd = endTime;count++;}}System.out.print("活动安排的编码顺序为: ");for (int i = 0; i < count; i++) {System.out.print((result[i] + 1) + " "); // 注意活动编号从1号开始}System.out.println();}public static void main(String[] args) {int[] start = {1, 3, 2, 5, 3, 5, 6, 8, 8, 2};int[] end = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};int n = 10;activity(start, end, n);}
}

        需要注意的是,在Java中数组不能动态声明大小,因此在Java代码中,数组result的大小需要在定义时确定,即为n。另外,Java中的循环语法与C有所不同,需要使用forwhile或者do-while语句等。

🎐 python程序:

def activity(start, end, n):result = [0] * n  # 结果数组,存储选中的活动编号prev_end_time = -1  # 上一个已选中的活动编号的结束时间count = 0  # 记录已选中的活动数量for i in range(n):start_time = start[i]end_time = end[i]if start_time >= prev_end_time:result[count] = i  # 将活动编码放入结果数组中prev_end_time = end_timecount += 1print("活动安排的编码顺序为:", end=' ')for i in range(count):print(result[i] + 1, end=' ')  # 注意活动编号从1号开始print()start1 = [1, 3, 2, 5, 3, 5, 6, 8, 8, 2]
end1 = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
activity(start1, end1, 10)

        需要注意的是,在Python中无法直接声明固定大小的数组,因此可以使用列表(List)代替。在Python中,索引从0开始,因此要将活动编号加1后打印。另外,在Python中使用print()函数代替C语言中的printf()函数进行输出。 

🎐C++程序:

#include <iostream>
using namespace std;void activity(int start[], int end[], int n) {int result[n];  // 结果数组,存储选中的活动编号int prev_end_time = -1;  // 上一个已选中的活动编号的结束时间int count = 0;  // 记录已选中的活动数量for (int i = 0; i < n; i++) {int start_time = start[i];int end_time = end[i];if (start_time >= prev_end_time) {result[count] = i;  // 将活动编码放入结果数组中prev_end_time = end_time;count++;}}cout << "活动安排的编码顺序为:";for (int i = 0; i < count; i++) {cout << result[i] + 1 << " ";  // 注意活动编号从1号开始}cout << endl;
}int main() {int start1[] = {1, 3, 2, 5, 3, 5, 6, 8, 8, 2};int end1[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};activity(start1, end1, 10);return 0;
}

        C++与C语言类似,但需要注意头文件、命名空间和输入输出等问题。在本例中,我们使用<iostream>作为标准输入输出库,并加上using namespace std;语句,以在后续的代码中可以省略std::命名空间前缀。输出时使用coutendl代替C语言中的printf()\n符号。其他部分与C语言代码类似。 

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

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

相关文章

RFID系统简介:优点、应用与发展前景

一、介绍RFID系统 RFID系统全称是Radio Frequency Identification&#xff0c;是一种通过电磁场自动识别标记&#xff08;Tag或RFID标签&#xff09;并读取相关数据的技术。与条形码技术相比&#xff0c;RFID系统最大的特点就是可以自动识别、无须接触扫描&#xff0c;并且可以…

简单对比一下 C 与 Go 两种语言

使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言&#xff0c;追溯其历史大部分源自编程语言 C。所以&#xff0c;任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易&#xff0c;同时避免了 C 编程语言的…

QML 带框最大化显示方法

1.QML窗口最大化很多会给出如下方法: visibility: "FullScreen" 此方法不好的方面是没有最大化&#xff0c;最小化&#xff0c;关闭按钮 2.通过showMaximized() 方法可以满足我们需求:在onCompleted 方法中执行 实现的效果如下:

QT基础入门——界面布局和常用控件(四)

前言&#xff1a; 所谓 GUI 界面&#xff0c;归根结底&#xff0c;就是一堆组件的叠加。我们创建一个窗口&#xff0c;把按钮放上面&#xff0c;把图标放上面&#xff0c;这样就成了一个界面。在放置时&#xff0c;组件的位置尤其重要。我们必须要指定组件放在哪里&#xff0c…

改变世界-生成式人工智能

麦肯锡在其《生成人工智能的经济潜力&#xff1a;下一个生产力前沿》中声称&#xff0c;“ChatGPT、GitHub Copilot、Stable Diffusion 等生成式人工智能应用程序以 AlphaGo 没有的方式吸引了世界各地人们的想象力&#xff0c;这要归功于它们广泛的实用性——几乎任何人都可以使…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#xff0c;需包含用户登录&#xff0c;用户删除&#xff0c;用户查询功能&#xff0c;并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口&#xff0c;规定必须完成用户登录&#xff0c;用户删除&#xff0c…

2019年[海淀区赛 第2题] 阶乘

题目描述 n的阶乘定义为n!n*(n -1)* (n - 2)* ...* 1。n的双阶乘定义为n!!n*(n -2)* (n -4)* ...* 2或n!!n(n - 2)*(n - 4)* ...* 1取决于n的奇偶性&#xff0c;但是阶乘的增长速度太快了&#xff0c;所以我们现在只想知道n!和n!!末尾的的个数 输入格式 一个正整数n &#xff…

华为OD七日集训第7期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第7期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、数据结构第4天、递归回溯第5天、二分查找第6天、深度优先搜索dfs算法第7天、动态规划 六、集训总结 大家好&a…

基于Stable Diffusion的图像合成数据集

当前从文本输入生成合成图像的模型不仅能够生成非常逼真的照片&#xff0c;而且还能够处理大量不同的对象。 在论文“评估使用稳定扩散生成的合成图像数据集”中&#xff0c;我们使用“稳定扩散”模型来研究哪些对象和类型表现得如此逼真&#xff0c;以便后续图像分类正确地分配…

【C++】Stack Queue -- 详解

一、stack的介绍和使用 1、stack的介绍 https://cplusplus.com/reference/stack/stack/?kwstack 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被…

Docker Mysql实战:docker compose 搭建Mysql

1、docker-compose-mysql文件准备 进入/home/docker目录&#xff0c;新建docker-compose-mysql.yml文件&#xff0c;内容如下&#xff1a; version: 3.0 services:mysql:image: "mysql:5.7"container_name: "mysql"environment:MYSQL_ROOT_PASSWORD: &q…

Java中树形菜单的实现方式(超全详解!)

前言 这篇文中&#xff0c;我一共会用两种方式来实现目录树的数据结构&#xff0c;两种写法逻辑是一样的&#xff0c;只是一种适合新手理解&#xff0c;一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码&#xff0c;主要是方便新人看懂&#xff0…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

AQS内部的体系架构

AQS本质上是一个双向队列&#xff0c;加一个状态位state。内部靠Node节点形成队列。 AQS由state和CLH变体的虚拟双端队列组成。 AQS的内部类Node类 属性说明&#xff1a; 内部结构&#xff1a;

上门按摩小程序|同城上门按摩软件开发|上门按摩系统;

上门按摩小程序的开发具有许多优势&#xff0c;下面就给大家介绍下按摩小程序功能: 上门按摩小程序的优势 方便快捷&#xff1a;上门按摩小程序提供在线预约服务&#xff0c;用户可以通过手机随时随地预约按摩师上门服务&#xff0c;避免了传统预约方式的繁琐和不确定性。 个性…

TCP/IP网络协议通信函数接口

创建套接字函数 socket 【头文件】 #include <sys/types.h> #include <sys/socket.h> 【函数原型】 int socket(int domain, int type, int protocol); 【函数功能】 socket 函数创建一个通信端点&#xff0c;并返回一个引用该端点的文件描述符&#xff0c;…

IDEA2021创建Web项目配置Tomcat

1.新建一个普通的项目。 2.右键新建的项目&#xff0c;选择添加框架支持 3.勾选web application 4.在WEB-INF里创建lib和classes文件夹 5.file-project structure-modules-paths&#xff0c;选择use module compile output path&#xff0c;将output path和test output path的路…

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码&#xff1a;五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为&#xff1a;EP4CE6F17C8 EEPROM芯片型号为&#xff1a;24L…

Linux CentOS7 yum仓库

在windows下安装一个软件很轻松&#xff0c;只要双击setup或者.exe的文件&#xff0c;安装提示连续“下一步”即可&#xff0c;然而linux系统下安装一个软件似乎并不那么轻松&#xff0c;因为我们不是在图形界面下。 本文我们将讨论如何在linux下安装一个软件。 一、linux软件…

混淆技术研究笔记(二)yGuard入门

yGuard官方文档地址&#xff1a;https://yworks.github.io/yGuard/index.html yGuard官方文档包含了比较全面的内容&#xff0c;由于文档是英文的&#xff0c;而且文档翻译后的浏览效果不是特别好&#xff0c;所以看文档入门有点难度。 这个系列的重点是混淆&#xff0c;所以…