西南交通大学【算法分析与设计实验2】

news2024/10/7 16:26:06

实验2.3 m_Coloring算法时间复杂性分析

实验目的

(1)实验比较数据输入规模对算法执行时间的影响。

(2)实验比较不同算法对问题求解时间的影响。

(3)掌握算法时间效率的分析方法。

实验任务

(1)阅读并理解实验2.3的源代码。

(2)分析实验2.3源代码中mColoring函数的时间复杂性。

(3)用C++语言实现该算法,绘制不同的m、n组合时算法的时间复杂度曲线和运行时间曲线,并进行简要分析。

(4)撰写实验报告,实验报告内容包括实验目的、实验任务、实验环境、实验步骤、实验结果和实验总结等部分。

实验步骤及结果

实验预习

mColoring算法时间复杂性分析

用C/C++语言实现的源代码

#include <iostream>
#include <ctime>
#include <fstream>
using namespace std;
class Color
{
    friend int mColoring(int, int, int **);

public:
    bool Ok(int k);
    void Backtrack(int t);
    int n, m, **a, *x;
    long sum;
};
int mColoring(int n, int m, int **a);
int main(void)
{
    ofstream ofs;
    // 三种曲线对应不同的文件名  m变化n不变--exp2_3_mdnb.txt   n变化m不变--exp2_3_mbnd.txt   一起变化--exp2_3_mdnd.txt
    ofs.open("exp2_3_mdnd.txt", ios::out);
    int n, m, **a, sum;
    // 如果要得一个变量不动另一个变量变化的结果将下面双重for循环改为单层
    // m = 8;  // m不变n从1到10 修改单层循环对n赋值
    // n = 9;  // n不变m从1到10 修改单层循环对m赋值
    // m分别为6和7 n从1到10
    for (int k = 6; k <= 7; ++k)
    {
        m = k;
        for (int j = 1; j <= 10; ++j)
        {
            clock_t start, end;
            double run_millisecond;
            n = j;
            // 将图设置为空图
            a = new int *[n + 1];
            for (int i = 0; i <= n; i++)
                a[i] = new int[n + 1];
            for (int i = 1; i <= n; i++)
            {
                for (int j = i + 1; j <= n; j++)
                {
                    a[i][j] = 0;
                    a[j][i] = a[i][j];
                }
            }
            // 对算法运行时间计时
            start = clock();
            sum = mColoring(n, m, a);
            end = clock();
            run_millisecond = double(end - start) / CLK_TCK * 1000;
            for (int i = 0; i <= n; ++i)
            {
                delete[] a[i];
            }
            delete[] a;
            // 将结果写入文件
            ofs << m << "," <<n<<","<< sum << "," << run_millisecond << endl;
        }
    }
    ofs.close();
    cout << "搞定" << endl;
    system("pause");
    return 0;
}
bool Color::Ok(int k)
{
    for (int j = 1; j <= n; j++)
        if ((a[k][j] == 1) && (x[j] == x[k]))
            return false;
    return true;
}
void Color::Backtrack(int t)
{
    sum++;
    if (t > n)
    {
        // sum++;
        return;
    }
    else
    {
        for (int i = 1; i <= m; i++)
        {
            x[t] = i;
            if (Ok(t))
                Backtrack(t + 1);
            x[t] = 0;
        }
    }
}
int mColoring(int n, int m, int **a)
{
    Color X;
    X.n = n;
    X.m = m;
    X.a = a;
    X.sum = 0;
    int *p = new int[n + 1];
    for (int i = 0; i <= n; i++)
        p[i] = 0;
    X.x = p;
    X.Backtrack(1);
    delete[] p;
    return X.sum;
}

上机实验

m不变n变化时的时间复杂度和运行时间曲线

m = 8  图为空图

图1  m不变n变化的算法时间复杂度曲线图

图2  m不变n变化的算法运行时间曲线图

可以看出,颜色个数不变的情况下,当节点个数n在8之后时,每次增加节点个数都会引起指数级时间复杂度和算法运行时间的增加。

n不变m变化时的时间复杂度和运行时间曲线

n = 9  图为空图

图3  n不变m变化的算法时间复杂度曲线图

图4  n不变m变化的算法运行时间曲线图

可以看出,在节点个数不变的情况下,当颜色个数n在6之后时,每次增加颜色个数都会引起指数级时间复杂度和算法运行时间的增加。

m在两种变化下,变量n的时间复杂度和运行时间曲线

m = 6 及 m = 7  图为空图

图5  m在两种变化下变量n的算法时间复杂度曲线图

图6  m在两种变化下变量n的算法运行时间曲线图

可以看出,在m为不同的数时,n在8之前增加引起的时间复杂度和算法运行时间的增加十分微弱,8之后时间复杂度和算法运行时间呈指数级增加,并且m越大增加越多。

绘制n=10时例2.5代码的递归树

程序验证:

实验总结

深刻认识到了输入数据的规模对于算法执行时间的影响,对算法时间复杂度的理解更为深入。对于不同算法求解同一问题时,理解了时间复杂度更小的算法在求解时间上所占据的优势。学习了算法时间效率的分析方法,可以通过算法执行次数以及算法运行时间两个方面来分析算法的时间效率,并可以通过图表直观地将结果表示出来。

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

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

相关文章

SwinIR: Image Restoration Using Swin Transformer(ICCV 2021)含代码复现

目录 一、Introduction 1 Motivation 2 Contribution 二、原理分析 1 Network Architecture 1&#xff09;Shallow feature extraction 2) deep feature extraction 3) image reconsruction modules 4) loss function 2 Residual Swin Transformer Block 三、实验结果…

认识String类

文章目录 String类字符串的遍历字符串的比较字符串的替换字符串的转换字符串的切割字符串的切片字符串的查找 总结 String类 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提 供的字符串系列函数完…

vue3实现echarts——小demo

版本&#xff1a; 效果&#xff1a; 代码&#xff1a; <template><div class"middle-box"><div class"box-title">检验排名TOP10</div><div class"box-echart" id"chart1" :loading"loading1"&…

WAF的新选择,雷池 SafeLine-安装动态防护使用指南

什么是 WAF WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。 区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击&#xff1b; 通俗来讲&#…

什么是 MySQL 锁等待?

本文基于 MySQL 8.0.32 源码&#xff0c;存储引擎为 InnoDB。 1. 先排队 不管是加表锁&#xff0c;还是加行锁&#xff0c;如果不能立即获得锁&#xff0c;加锁事务都需要进入锁等待状态。 事务进入锁等待状态&#xff0c;需要用锁结构来排队。和立即获得锁时的锁结构一样&am…

【Python+微信小程序】学生考勤签到系统(已开源)

1. 简介 &#x1f61d; 这个项目是一款基于微信小程序和Flask框架开发的应用&#xff0c;旨在帮助学校管理学生的考勤和课程信息。系统通过集成数据库管理、API开发以及前后端交互&#xff0c;实现了便捷的学生考勤记录、课程表管理和教师交互功能。其主要特点包括&#xff1a…

intellij idea中使用R语言plot画图无图像问题

1、在intellij idea中使用R语言plot函数时&#xff0c;会遇到各种各样的问题&#xff0c;会出现图片不显示问题&#xff0c; 可以看到&#xff0c;目前我电脑r语言版本为4.2.1&#xff0c;输入下面代码&#xff1a; # # 安装包 # install.packages(ggplot2) # library(ggplot2…

AI是在帮助开发者还是取代他们

目录 1.概述 1.1.AI助力开发者 1.2.AI对开发者的挑战 2.AI工具现状 2.1. GitHub Copilot 2.2. TabNine 2.3.小结 3.AI对开发者的影响 3.1.对开发者的影响 3.2.开发者需要掌握的新技能 3.3.在AI辅助的环境中保持竞争力的策略 4.AI开发的未来 5.总结 1.概述 生成式…

【VScode】常用配置

1.indenticator 增加白色竖条&#xff0c;显示方法范围 2.Git Graph 给git变换分支增添颜色区分 3.Vue 系列 vue 系列&#xff1a;给纯白色代码添加 颜色区分 3.eslint eslint警告&#xff0c;比如{ } 只写了半个会标红提示错误 等错误信息提示 需要配置js等页面 非下…

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【前端】vue 报错:The template root requires exactly one element

【前端】vue 报错&#xff1a;The template root requires exactly one element 写在最前面Prettier - Code formatter插件解决 Vue 报错&#xff1a;The template root requires exactly one element错误原因示例 解决方法更复杂的示例使用 Fragment 解决问题 小结 &#x1f3…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下&#xff1a; 一、了解卷积神经网络 卷积神经网络的作用 总的来说&#xff0c;卷积神经网络的第一个主要作用是对图像进行特征提取&#xff0c;所谓特征提取&#xff0c;就是明白…

亚马逊测评策略全攻略:详析各方案优势与局限,你精通了吗?

亚马逊测评&#xff0c;一个绕不开的话题。不管是对于新手卖家还是资深卖家来说&#xff0c;它都是提升产品销量和排名的有效手段之一。接下来&#xff0c;我将为大家详细解析亚马逊测评的各种方式和注意事项。 一、精准筛选真人测评资源 在寻找真人测评资源时&#xff0c;许多…

【深度学习】扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下&#xff0c;文档扫描功能…

记录一次MySQL恢复

一、前言 此文章由一次数据库被黑客删除而引发 由于对于Linux操作、docker使用、MySQL原理这些都相对不是很熟悉&#xff0c;所以记录下来避免以后在工作中遇到类似的问题而惊慌失措。 1.MySQL环境现状 docker管理的&#xff0c;8.0.26版本 启动语句: docker run -d -p 33…

python pdfplumber优化表格提取

样例pdf 直接使用文本提取效果&#xff1a; 使用表格提取 根据提取的文本信息是没办法获取到表格数据的&#xff0c;太乱了。尤其是 3 4列。 解决&#xff1a; 自行画线&#xff0c;根据画线进行提取。 效果&#xff1a; 思路&#xff1a; 1.根据表头进行画竖线 2.根据行坐…

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用&#xff1a; import { createApp } from v…

vue的$nextTick是什么是干什么用的?

为什么需要使用$nextTick&#xff1f;他的使用场景 1.你在接口返回之后在获取高度 正常等页面加载在mounted这个钩子函数里 这时候就需要找到接口赋值的地方 这样就可以获取到数据操作以后的dom元素了 $nextTick是什么是干什么用的&#xff1f; $nextTick() 是 Vue.js 框…

超详细:安装Linux系统、虚拟现实教程

文章目录 一、如何下载并使用VMware虚拟机1.百度搜索vmware2.进入官网点击Workstation Pro链接3.博通注册对应的账号4.博通填写用户名、密码后直接登录会跳转到博通登录页5.个人使用选择个人版 二、国内镜像网站下载&#xff08;Centos版本&#xff09;三、镜像系统的安装1.打开…

【等保2.0的内容有哪些?】

“在“等保2.0”的基础上&#xff0c;分别增加了云计算安全、移动互联安全、物联网安全、工控系统安全、大数据安全5个拓展需求。 《中华人民共和国刑法》第253条&#xff0c;非法将公民个人资料卖给他人&#xff0c;并处罚金。 违反国家相关法律法规&#xff0c;将其在执行公…