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

🎃欢迎大家前去观看我的算法设计与分析专栏: 算法设计与分析_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,一经查实,立即删除!

相关文章

接口测试常见问题

1.接口测试的流程 测试计划与方案 --> 接口用例设计 --> 接口测试执行 --> 缺陷报告与结果分析 2.接口工具的流程 脚本的设计&#xff0c;数据用例的设计&#xff0c;断言&#xff08;预期结果的设计&#xff09;&#xff0c;执行 3.测试计划与方案&#xff1a; …

sourceTree无法启动

前几天win10系统自动更新后&#xff0c;sourceTree就无法打开了&#xff0c;双击只是图标闪一下&#xff0c;电脑重启后还是无法打开。找到了网上几种方法进行尝试&#xff1a; 方法一&#xff1a;修改配置信息 在自己的电脑路径下&#xff1a; C:\Users\你的用户名\AppData…

每个.NET开发都应掌握的C#特性(Attribute)知识点

上篇文章讲述了C#反射知识点&#xff0c;本文将介绍C#特性&#xff08;Attribute&#xff09;的知识点。C#特性&#xff08;Attribute&#xff09;是一种强大的元数据机制&#xff0c;用于为代码元素&#xff08;如类、方法、属性等&#xff09;添加信息&#xff0c;以影响它们…

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

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

gin实现event stream

event stream是属于http的一种通信方式&#xff0c;可以实现服务器主动推送。原理于客户端请求服务器之后一直保持链接&#xff0c;服务端持续返回结果给客户端。相比较于websocket有如下区别&#xff1a; 基于http的通信方式&#xff0c;在各类框架的加持下不需要开发人员自己…

Explainability for Large Language Models: A Survey

本文是LLM系列文章&#xff0c;针对《Explainability for Large Language Models: A Survey》的翻译。 大型语言模型的可解释性:综述 摘要1 引言2 LLM的训练范式3 传统微调范式的解释4 提示范式的解释5 评估的解释6 研究挑战7 结论 摘要 大型语言模型(llm)在自然语言处理方面…

【Leetcode Sheet】Weekly Practice 10

Leetcode Test 123 买卖股票的最佳时机Ⅲ(10.3) 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意&#xff1a;**你不能同时参与多笔交易&#xff08;你必须在再次购…

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

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

阶段五-Day03-Ajax

一、JavaWeb中路径的说明 1. JavaWeb中的路径 在JavaWeb中, 路径分为相对路劲和绝对路径两种: 相对路径: ./ 表示当前目录 ../ 表示当前文件所在目录的上一级目录 绝对路径: 完整的路径名 2. 在JavaWeb中/的不同意义 /斜杠如果被浏览器解析,得到的是 协议本地ip端口号…

第十二章:泛型(Generic)

1&#xff1a;为什么要有泛型&#xff1f; 泛型&#xff1a;&#xff08;标签&#xff09;允许在定义类、接口时候通过一个标识来表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型、参数将在使用时&#xff08;例如&#xff1a;继承或实现这个接口&#xff0…

QML 带框最大化显示方法

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

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

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

妙鸭相机功能代码复现

妙鸭相机功能代码复现 妙鸭相机主要实现人脸替换与人脸高清增强修复功能。可通过两种方式实现Roop和Lora模型。 RooP笔记 基础模型:inswapper_128.onnx 人脸分析模型:insightface 高清增强模型:gfpgan 大体流程为通过insightface检测出人脸,替换人脸,使用gfpgan对人…

设计模式——14. 观察者模式

1. 说明 观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含…

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

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

Java中的Iterator

Java中的Iterator Iterator 是Java中的一个接口&#xff0c;它提供了一种访问集合&#xff08;如列表、集合等&#xff09;中元素的标准方式。Iterator 具有一些特点、优点和缺点&#xff0c;下面详细介绍如何使用它以及相关信息。 使用Iterator&#xff1a; 创建Iterator&am…

动态代理初步了解

准备案例 需求 模拟某企业用户管理业务&#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;以便后续图像分类正确地分配…