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

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

🎯目的:


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::命名空间前缀。输出时使用cout和endl代替C语言中的printf()和\n符号。其他部分与C语言代码类似。  

相关文章
|
9天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
18天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
72 1
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
69 2
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
5天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
6天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
6天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。