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

news2024/11/16 22:30:49

🎃欢迎大家前去观看我的算法设计与分析专栏: 算法设计与分析_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_time
            count += 1

    print("活动安排的编码顺序为:", 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.coloradmin.cn/o/1074094.html

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

相关文章

现场大屏互动游戏微信上墙“摇一摇”全攻略

随着科技的发展&#xff0c;现场活动越来越依赖数字互动来提升参与度和气氛。其中&#xff0c;现场大屏互动游戏微信上墙“摇一摇”是一种非常受欢迎的方式&#xff0c;它能有效地提升现场观众的参与度和活跃度。本文将为您提供从准备到实施的全程攻略&#xff0c;帮助您轻松掌…

打印字节流和字符流

打印字节流和字符流 printStream/ printWriter的构造器和方法都是一样的 package printfile;import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.nio.charset.Charset;public class Prin…

如何使用potplayer在公网访问群晖webdav?

把potplayer变成netflix需要几步&#xff1f; ​ 国内流媒体平台的内容让人一言难尽&#xff0c;就算是购买了国外的优秀作品&#xff0c;也总是在关键剧情上删删减减&#xff0c;就算是充了会员&#xff0c;效果如何&#xff1f; 广大网友不得不选择自己找资源下到本地&#x…

戏剧影视设计制作虚拟仿真培训课件提升学生的参与感

说起影视制作&#xff0c;知名的影视制片人寥寥无几&#xff0c;大多数人还在依靠摄影机拍摄实景或搭建实体场景来不断精进场景布局和导演效果&#xff0c;成本高、投入人员多且周期长&#xff0c;随着VR虚拟现实技术的不断发展&#xff0c;利用VR模拟仿真技术进行影视制作实操…

【FreeRTOS】【STM32】01从零开始的freertos之旅 浏览源码下的文件夹

基于野火以及正点原子 在打开正点原子的资料pdf时&#xff0c;我遇到了pdf无法复制粘贴的问题&#xff0c;这里有个pdf解锁文字复制功能的网址&#xff0c;mark一下。超级pdf 参考资料《STM32F429FreeRTOS开发手册_V1.2》 官方资料 FreeRTOS 的源码和相应的官方书籍均可从官…

【AI】深度学习——人工智能、深度学习与神经网络

文章目录 0.1 如何开发一个AI系统0.2 表示学习(特征处理)0.2.1 传统特征学习特征选择过滤式包裹式 L 1 L_1 L1​ 正则化 特征抽取监督的特征学习无监督的特征学习 特征工程作用 0.2.2 语义鸿沟0.2.3 表示方式关联 0.2.4 表示学习对比 0.3 深度学习0.3.1 表示学习与深度学习0.3.…

vue2踩坑之项目:Swiper轮播图使用

首先安装swiper插件 npm i swiper5 安装出现错误&#xff1a;npm ERR npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/esl…

数据结构与算法(七):搜索算法

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮减少一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止 给定一个长度为 n 的…

WebDAV之π-Disk派盘 + 咕咚云图

咕咚云图是一款强大的图床传图软件,它能够让您高效地对手机中的各种图片进行github传输,多个平台快速编码上传,支持远程删除不需要的图片,传输过程安全稳定,让您可以很好的进行玩机或者其他操作。 可帮你上传手机图片到图床上,并生成 markdown 链接,支持七牛云、阿里云…

SRM系统快速便捷退货的解决方案

一、SRM系统简介&#xff1a; SRM系统是一种基于互联网技术的供应链管理解决方案&#xff0c;旨在加强供应商与采购商之间的合作关系&#xff0c;优化供应链的效率和可靠性。它提供了一系列功能模块&#xff0c;包括采购管理、供应商管理、订单管理、物流管理等。其中&#xf…

平衡小车调车保姆式教程

前言 &#xff08;1&#xff09;硬件选型注意点&#xff1a;电机转速、轮子大小 &#xff08;2&#xff09;车模硬件结构注意点&#xff1a;车模整体的重量要分布均匀&#xff0c;利于平衡 &#xff08;3&#xff09;硬件主要模块&#xff1a;陀螺仪、编码器电机、显示屏、驱动…

ElasticSearch搜索引擎:数据的写入流程

一、ElasticSearch 写数据的总体流程&#xff1a; &#xff08;1&#xff09;ES 客户端选择一个节点 node 发送请求过去&#xff0c;这个节点就是协调节点 coordinating node &#xff08;2&#xff09;协调节点对 document 进行路由&#xff0c;通过 hash 算法计算出数据应该…

设计模式 - 结构型模式考点篇:适配器模式(类适配器、对象适配器、接口适配器)

目录 一、适配器模式 一句话概括结构式模式 1.1、适配器模式概述 1.2、案例 1.2.1、类适配器模式实现案例 1.2.2、对象适配器 1.2.3、接口适配器 1.3、优缺点&#xff08;对象适配器模式&#xff09; 1.4、应用场景 一、适配器模式 一句话概括结构式模式 教你将类和对…

剑指offer——JZ68 二叉搜索树的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q&#xff0c;最近公共祖先LCA(T,p,q)表示一个节点x&#…

头戴式耳机哪个牌子音质好?Y2K的福音!Umelody轻律 U1头戴式耳机分享

作为一款国产头戴式蓝牙耳机&#xff0c;Umelody轻律 U1绝对是性价比之选&#xff0c;可以说是Y2K的福音&#xff0c;复古味十足的设计&#xff0c;快捷方便的蓝牙连接和多功能实用的操作方式&#xff0c;最关键的还是价格低&#xff0c;300元的价格不到就可以拿下。 创始团队…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是&#xff1a;部署在去中心化区块链上的一个合约或者一组指令&#xff0c;当这个合约或者这组指令被部署以后&#xff0c;它就不能被改变了&#xff0c;并会自动执行&#xff0c;每个人都可以看到合约里面的条款。更深层次的理解就是&#xff1a;这些代码会…

vue实现自定义滚动条

vue实现自定义滚动条 具体效果如下&#xff0c;这边我用的rem单位&#xff0c;比例是1:40&#xff0c; 先写下页面布局&#xff0c;把原生的滚动条给隐藏掉&#xff0c;给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…

基于spso算法的航线规划

matlab2020a GitHub - duongpm/SPSO: Spherical Vector-based Particle Swarm Optimization

智能集成式电力电容器在山东某环保材料制造厂中的应用-安科瑞黄安南

摘要 分析智能集成式电力电容的工作原理及功能&#xff0c;结合山东环保材料制造厂配电现状&#xff0c;选择经济可靠的方案&#xff0c;智能电容过零投切与低功耗&#xff0c;解决了继电器投切产生涌流的问题&#xff1b;接线简单&#xff0c;扩容方便&#xff0c;解决无功补…

MIPS汇编语言实现hello world和冒泡排序

WinMIPS64的IO方法输出hello world 编写一个简单的终端输出“Hello World&#xff01;&#xff01;”的小程序&#xff0c;首先写好一些数据包括CONTROL和DATA的地址以及字符串Hello World&#xff0c;然后将CONTROL和DATA的地址存储在寄存器中以之作为基址&#xff0c;将字符…