算法实验3:贪心算法的应用

news2024/12/24 8:54:59

实验内容

(1)活动安排问题

    设有n个活动的集合E={1, 2, …, n},其中每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。 随机生成n个任务(n=8,16,32…),用贪心法求解,分析算法的时间复杂度,做出图像,横坐标为活动个数,纵坐标为执行时间。

(2)线段覆盖

问题描述:在一维空间中随机生成N(N=8,16,32…)条线段的起始坐标与终止坐标,要求求出这些线段一共覆盖了多大的长度(重叠区域只算一次)。分析算法的时间复杂度,画出算法的执行时间随N变化的曲线图。

实验结果

(1)活动安排问题

运行时间与n输入大小的曲线图

算法中将各个活动按照结束时间从小到大排序,时间复杂度为O(nlogn),依次考察每个活动,时间复杂度为O(n),算法的时间复杂度为O(nlogn)

(2)线段覆盖

运行时间由于输入个数的曲线图

算法中对线段进行按起点排序的时间复杂度是O(nlogn),依次对剩余线段进行判断时的时间复杂度时O(n),整个算法的时间复杂度应为O(nlogn)

源代码

活动安排问题

#include<iostream>
#include<time.h>
using namespace std;
void sort(int n, int s[], int f[])//按照结束时间非递减排序
{
    int a, b, i, j;
    for (i = 0; i < n; i++)
        for (j = i + 1; j < n; j++)
            if (f[i] > f[j])
            {
                a = f[i]; f[i] = f[j]; f[j] = a;
                b = s[i]; s[i] = s[j]; s[j] = b;
            }
}
int Greedy(int n, int s[], int f[], bool B[])
{
    B[1] = true;//将第一个活动先安排
    int j = 1, count = 1; //count为被安排的节目个数
    for (int i = 2; i <= n; i++)
    {
        if (s[i] >= f[j])//活动i与集合B中最后结束的活动相容
        {
            B[i] = 1;//安排活动i
            j = i;
            count++;
        }
        else
            B[i] = 0;
    }
    return count;//返回已安排的活动个数
}
int main()
{
    srand((unsigned int)time(NULL));
    int a, b, n, i;
    bool B[2048];
    int s[2048], f[2048];
    clock_t start, end;
    cout << "输入n的大小:";
    cin >> n;
    for (i = 0; i < n; i++)
    {
        a = rand() % 1000 + 1;
        b = rand() % 1000 + 1;
        if (a > b)
        {
            f[i] = a;
            s[i] = b;
        }
        else
        {
            s[i] = a;
            f[i] = b;
        }
    }
    start = clock();
    for (i = 0; i < n; i++)
        sort(n, s, f);
    int g=Greedy(n, s, f, B);
    cout << "活动安排的个数是:" << g << endl;
    for (i = 1; i <= n; i++)
        cout << B[i] << " ";
    end = clock();
    cout << endl;
    cout << "安排活动耗时:" << double(end - start)*1000 / CLOCKS_PER_SEC<<" ms";
    return 0;
}

线段覆盖

#include<iostream>
#include<time.h>
using namespace std;
struct line//线段结构体
{
    int start;
    int end;
};
void sort(line l[], int n)//将线段按照大小排序
{
    int i, j;
    line temp, temp1;
    for (i = 0; i < n; i++)
        for (j = 0; j < n - i - 1; j++)
        {
            if (l[j].start > l[j + 1].start)
            {//起点小的在前面
                temp = l[j];
                l[j] = l[j + 1];
                l[j + 1] = temp;
            }
            if (l[j].start == l[j + 1].start && l[j].end > l[j + 1].end)
            {//起点相同则终点小的在前面
                temp1 = l[j];
                l[j] = l[j + 1];
                l[j + 1] = temp1;
            }
        }
}
int cover(line l[], int n, int length)
{
    int i, len = length;
    if (n == 1)//只有一个线段直接返回长度
        return len;
    for (i = 1; i < n; i++)
    {
        if (l[i].start >= l[i - 1].start && l[i].start <= l[i - 1].end && l[i].end >= l[i - 1].end)
            len += l[i].end - l[i - 1].end;//线段长度增加两终点之差
        else if (l[i].start >= l[i - 1].end)
            len += l[i].end - l[i].start;//线段长度增加当前线段的长度
        else if (l[i].start >= l[i - 1].start && l[i].end <= l[i - 1].end)
            l[i].end = l[i - 1].end;//线段长度不增加
    }
    return len;
}
int main()
{
    line l[16384];
    int n, i, ln, length;
    clock_t cstart, cend;
    srand((unsigned)time(NULL));
    cout << "输入线段的个数:";
    cin >> n;
    cstart = clock();
    for (i = 0; i < n; i++)
    {
        l[i].start = rand() % 100 + 1;
        l[i].end = rand() % 100 + 1;
    }
    sort(l, n);//对所有线段进行排序
    ln = l[0].end - l[0].start;
    length = cover(l, n, ln);//求线段覆盖的长度
    cend = clock();
    cout <<"线段覆盖长度:"<< length << endl;
    cout << "耗时" << double(cend - cstart) * 1000 / CLOCKS_PER_SEC << " ms" << endl;
    return 0;
}

感谢大家的观看

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

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

相关文章

# Redis 入门到精通(五)-- redis 持久化(3)

Redis 入门到精通&#xff08;五&#xff09;-- redis 持久化&#xff08;3&#xff09; 一、redis 持久化–AOF 自动重写配置 1、AOF 自动重写方式–自动重写触发条件设置 auto-aof-rewrite-min-size size auto-aof-rewrite-percentage percent2、AOF 自动重写方式-- 自动重…

如何在Orcale首页定位到The Java® Virtual Machine Specification页面?

目标地址&#xff1a;https://docs.oracle.com/javase/specs/jls/se8/html/index.html 1. 在Orcale首页菜单栏中选择 Resources ⇒ Java Downloads 2. 往下滑&#xff0c;找到 Online Documentation 选项&#xff0c;点进去 3. 点击 Specifications 下的 Language VM 选项 5…

USB3.0接口——(5)Host数据传输模型

USB3.0接口系列&#xff1a; USB3.0接口——&#xff08;1&#xff09;基础知识 USB3.0接口——&#xff08;2&#xff09;数据结构 USB3.0接口——&#xff08;3&#xff09;协议层&#xff08;包格式&#xff09; USB3.0接口——&#xff08;4&#xff09;生产消费者模型…

IOC、DI<5> Unity、AOP

Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能 其它跟上一次一样 <?xml version"1.0" encoding"utf-8" ?> <configuration><configSections><section name"unity" type"Microsoft.Practice…

【Harmony】SCU暑期实训鸿蒙开发学习日记Day1

关于ArkTS和ArkUI&#xff0c;基础语法请看&#x1f449;官方开发手册 系统学习后&#xff0c;聊聊几个点&#xff0c;面向刚学习这门语言的小白&#xff0c;用于巩固和回顾&#x1f60b; 目录 类型推断应用 函数相关 布局方式 线性布局 堆叠布局 网格布局 弹性布局 …

C#进阶-基于.NET Framework 4.x框架实现ASP.NET WebForms项目IP拦截器

在这篇文章中&#xff0c;我们将探讨如何在 ASP.NET WebForms 中实现IP拦截器&#xff0c;以便在 ASMX Web 服务方法 和 HTTP 请求 中根据IP地址进行访问控制。我们将使用自定义的 SoapExtension 和 IHttpModule 来实现这一功能&#xff0c;并根据常用的两种文本传输协议&#…

jmeter之变量随机参数化以及解决多线程不会随机变化

参考链接&#xff1a; https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化&#xff1f;_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示&#xff0c;需要对请求参数 autor 和phone进行随机参数化 2、目前有…

2024大模型十大趋势

2024大模型十大趋势 关键要点一、机器外脑时代的智慧探索二、机器外脑、创意生成和情感陪伴三、大模型驱动的新未来&#xff1a;AI带来创意转化与机遇四、人物-行为-场景一体化&#xff1a;未来人工智能的新范式五、未来数字内容生产的基础设施六、共创、共建、共享智能美好未来…

Linux - 冯-诺依曼体系结构、初始操作系统

目录 冯•诺依曼体系 结构推导 内存提高效率的方法 数据的流动过程 体系结构相关知识 初始操作系统 定位 设计目的 操作系统之上之下分别有什么 管理精髓&#xff1a;先描述&#xff0c;再组织 冯•诺依曼体系 结构推导 计算机基本工作流程图大致如下&#xff1a; 输入设备&a…

删除windows系统里磁盘的恢复分区

说下我的情况 我买了块固态磁盘&#xff0c;插上主板&#xff0c;发现它自带了系统&#xff0c;这样我开机就会转到这块磁盘&#xff0c;即使在boot里改变也不行&#xff0c;后面我格式化了对应的盘符&#xff0c;但在磁盘管理里&#xff0c;发现有个EFI系统分区和恢复分区存在…

初识并发编程

并发编程的目的是 为 了 让 程序运行得更快&#xff0c;但是&#xff0c;并不是启 动 更多的 线 程就能 让 程序最大限度地并发执 行。在 进 行并 发编 程 时 &#xff0c;如果希望通 过 多 线 程 执 行任 务让 程序运行得更快&#xff0c;会面临 非常多的挑 战 &#xff0c;比…

【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录

文章目录 前言一、几个关键概念1.HTTP无状态性2.Session机制3.Token认证4.JWT 二、通过手机号验证码登录1.前端短信登录界面2.发送短信接口与短信登录接口3.Vue 设置interceptors拦截器4. 服务端验证采用自定义中间件方式实现5. 操作流程及效果图如下&#xff1a; 三、通过第三…

编程从零基础到进阶(更新中)

题目描述 依旧是输入三个整数&#xff0c;要求按照占8个字符的宽度&#xff0c;并且靠左对齐输出 输入格式 一行三个整数&#xff0c;空格分开 输出格式 输出它们按格式输出的效果&#xff0c;占一行 样例输入 123456789 -1 10 样例输出 123456789-1 10 #include "stdio.…

昇思25天学习打卡营第七天|应用实践/热门LLM及其他AI应用/基于MobileNetv2的垃圾分类

心得 本课程主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 这个AI是我觉很不错的一个想法。比较解决实际的痛点&#xff0c;就是作为普通人来讲&#xff0c;不可能像专…

「安全知识」叉车超速的危害引发的后果是这样的……

在繁忙的工业环境中&#xff0c;叉车作为不可或缺的物流工具&#xff0c;其安全性直接关系到生产效率和员工生命安全。然而&#xff0c;当叉车驾驶员忽视速度限制&#xff0c;超速行驶时&#xff0c;一系列潜在的危险便悄然滋生。本文将讲解叉车超速的危害以及解决措施&#xf…

pip install安装第三方库 error: Microsoft Visual C++ 14.0 or greater is required

原因&#xff1a; 在windows出现此情况的原因是pip安装的库其中部分代码不是python而是使用C等代码编写&#xff0c;我们安装这种类型的库时需要进行编译后安装。 安装Microsoft C Build Tools软件&#xff0c;但这种方式对于很多人来说过于笨重。&#xff08;不推荐&#xf…

脚本新手必看!一文掌握${}在Shell脚本中的神操作!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 变量引用与默认值📝 字符串操作📝 数组与索引📝 参数扩展与模式匹配⚓️ 相关链接 ⚓️📖 介绍 📖 在编程的广阔世界里,隐藏着无数小巧而强大的工具,它们如同魔法般简化着复杂的操作。今天,我将…

黑马头条-环境搭建、SpringCloud

一、项目介绍 1. 项目背景介绍 项目概述 类似于今日头条&#xff0c;是一个新闻资讯类项目。 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#xff0c;因此&#xff0c;对于移动资讯客…

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

无人机技术优势及发展详解

一、技术优势 无人机&#xff08;Unmanned Aerial Vehicle&#xff0c;UAV&#xff09;作为一种新兴的空中智能平台&#xff0c;凭借其独特的技术优势&#xff0c;已经在众多领域中展现出强大的应用潜力和实用价值。以下是无人机的主要技术优势&#xff1a; 1. 自主导航与远程…