NJUPT算法分析与设计期末考试2021.11.24

news2024/9/21 1:47:37

NJUPT算法分析与设计期末考试2021.11.24

  • 判断
  • 简答
    • 1.算法是什么?算法的时间复杂度是什么?衡量的原则,标准,工具
    • 2.分支限界法扩展活节点的方式有哪两种,有什么差别?
    • 3.回溯法搜索子集树,排列树的算法。P124
      • 回溯法搜索子集树
      • 回溯法搜索排列树
    • 4.剪枝策略:什么是约束函数,什么是限界函数,区别是什么?
    • 5.递归分治策略和动态规划策略的相同和不同
  • 算法设计
    • 一、递归+分治(修改的二分搜索问题)
      • 问题描述
      • 1.二分搜索的基本思想
      • 2.实现
    • 二.DP(最大字段和问题)
      • 问题描述
      • 1.最优子结构递推方程
      • 2.算法框架
      • 3.实例推导
      • 4.时间复杂度
    • 三.贪心(最优装载问题)
      • 问题描述
      • 1.数学模型
      • 2.算法框架
      • 3.时间复杂度
      • 4.正确性分析![在这里插入图片描述](https://img-blog.csdnimg.cn/693a604c0b0d4351ba9f1038fb151368.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/3a59555abe7149f89c5d08021f98b14c.png)
    • 四.回溯和分支限界(旅行商问题)
      • 1.解空间是子集树还是排列树在?
      • 2.回溯法求解的过程
      • 3.分支限界法求解的过程

用书:计算机算法设计与分析(第五版)
判断10题30分
简答5题30分
算法设计4*10=40分

判断

1.程序、算法、软件是不完全等价的。
2.最优化问题不是都可以用动态规划来求解,使用动态规划要满足(子问题间有依赖关系;有最优子结构)。
3.分治策略是先把复杂的问题自顶向下求解,然后自底向上合并,不一定要用递归,用迭代也可以。
4.动态规划能求解的问题,贪心策略不一定能求解,反之也不行。(如0-1背包问题可以用动态规划但不能用贪心;背包问题可以用贪心但不能用递归)。
5.两个序列的公共子序列和最长公共子序列都不唯一。
6.棋盘覆盖问题8*8的棋盘用(64-1)/3=21块骨牌。
7.哈夫曼算法是贪心算法,每次选择频率最高的两个节点合并成子树。
8.不同的排序算法针对不同实例,速度效率不一样。
9.常用的时间复杂度。

简答

1.算法是什么?算法的时间复杂度是什么?衡量的原则,标准,工具

(PPT ch1)

  • 算法的定义:算法是对特定问题求解步骤的一种描述,它是由若干指令组成的有穷序列,特性(输入、输出、有穷、确定、可行)
  • 时间算法复杂度:是对算法执行所需的时间的一种度量;
  • 原则标准:统一机器性能,分析最坏情况
  • 工具:渐进分析方法:忽略T(n)的系数与低阶项,仅关注高阶项;

2.分支限界法扩展活节点的方式有哪两种,有什么差别?

  • 队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
  • 优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

3.回溯法搜索子集树,排列树的算法。P124

http://wjhsh.net/xymqx-p-3702921.html

回溯法搜索子集树

//回溯法搜索子集树
void Backtrack(int t){
{
    if(t>n)
        output(x);
    else
    {
        for(int i=0;i<=1;i++)   //子集树只考虑取或者不取,所以解向量只有0或1;
        {
            x[t]=i;   
            if(Constraint(t)&&Bound(t))
                Backtrack(t+1);
        }
    }
}

回溯法搜索排列树

//回溯法搜索排列树
void Backtrack(int t){
{
    if(t>n)
        output(x);
    else
    {
        for(int i=0;i<=n;i++)
        {
            Swap(x[t],x[i]);    //把当前递归层的元素依次和其他元素交换
            if(Constraint(t)&&Bound(t))
                Backtrack(t+1);  //进入下一层递归
            Swap(x[t],x[i]);   //回溯时候恢复之前的交换
        }
    }
}

4.剪枝策略:什么是约束函数,什么是限界函数,区别是什么?

约束函数:在扩展节点处剪去不满足约束的子树
限界函数:用限界函数剪去不能得到最优解的子树
都是剪去不必要搜索的子树,约束函数剪去的是无解的子树,而限界函数剪去的是得不到最优解的子树。

5.递归分治策略和动态规划策略的相同和不同

相同:都是把大问题转化为子问题来解决
不同:递归分治的子问题相互独立,动态规划的子问题是相互依赖的,有最优子结构

算法设计

一、递归+分治(修改的二分搜索问题)

问题描述

改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

1.二分搜索的基本思想

二分搜索方法充分利用了元素间的次序关系,采用分治策略,可以在最坏情况下用O(logn)时间完成搜索任务,将n个元素分成个数大致相同的两半,取a[n/2]与x进行比较,若x=a[n/2],则找到x,算法终止;x=a[n/2],则只在数组左半部递归的搜索;若x>a[n/2],则只在数组右半部递归的搜索。

2.实现

int Binary_Search(int a[],int length, int x)       //a是搜索数组,x为搜索元素
{
	int i = 0, j = 0; //用来输出结果
	int flag = -1;//标志位
	int high = length - 1; // 数组的右边界
	int mid = 0;  //中间值的下标
	int low = 0; //数组的左边界
 
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (a[mid] == x)
		{
			flag = middle;
		}
		if (a[mid] < x)
		{
			low = mid + 1;
		}
		else
		{
			top = mid - 1;
		}
	}
	if (flag == -1)
	{
		i = high;
		j = low;
	}
	else
	{
		i = j = flag ;
	}
    cout<<i<<j;
	return 0;
}

二.DP(最大字段和问题)

问题描述

在这里插入图片描述

1.最优子结构递推方程

在这里插入图片描述

2.算法框架

void dp(int D[],int X[],int R[],n)
{ //X[i]存储第i个数字的值,D[i]表示以x[i]为开头的最大字段和的值;R[]
    D[n]=X[n]; //最后一位开头的最长子段和只能是本身
    R[n]=n;   //最后一位的右端点只能是n
    for(int i=n-1;i>=n;i--)
    {   //最后一个位置的数字作为初值,从倒数第二个位置开始从后向前递推
        if(D[i+1]>0) 
            D[i]=X[i]+D[i+1]; //如果以i+1位置开头的最大字段和大于0,那么以i位置开头最大字段和就是当前位置的数值+后面的最大字段和的值。
        else{
            D[i]=X[i]; //如果以i+1位置开头的最大字段和小于0;
            R[i]=i; //此时最大字段和的右端就是i本身
            }
    }
}

void MaxSum(int D[],int R[]}
{
    S_max=D[1] //先假设以第一个数字开头的最大字段和为全局最大字段和
    for(int i=2;i<=n;i++)
    {
        if(S_max<D[i])
        {
            l=i;
            r=R[i];
        }
    }
    cout<<"最大字段和从位置"<<l<<"到位置"<<r<<"其值为"<<D[l];
}     
        

3.实例推导

在这里插入图片描述

4.时间复杂度

O(n)

三.贪心(最优装载问题)

问题描述

在这里插入图片描述

1.数学模型

在这里插入图片描述

2.算法框架

void Loading(int x[],  Type w[], Type c, int n)
{
        int *t = new int [n+1];   //动态数组t用来存放排序后的货物
        Sort(w, t, n);    //将集装箱按重量把数组w非减排序存放到数组t中
        for ( int i = 1; i <= n; i++ ) 
                        x[i] = 0;  //决策变量初始化
        for ( int i = 1; i <= n  && w[t[i]] <= c; i++ ) {
                        x[t[i]] = 1;   //决策变量的对应位置置为1
                        c -= w[t[i]]; //更新当前的荷载量
        } //在剩余集装箱中选择最轻的装船,直至超重
}

3.时间复杂度

O(nlogn) 主要来自把货物按重量排序的算法sort()

4.正确性分析在这里插入图片描述在这里插入图片描述

四.回溯和分支限界(旅行商问题)

1.解空间是子集树还是排列树在?

答:排列树,因为每个城市都要访问。

2.回溯法求解的过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//旅行商问题回溯算法的实现
//形参t是回溯的深度,从2开始
void Backtrack(int t)
{
  //到达叶子结点的父结点
  if(t==n)
  {
    if(a[x[n-1]][x[n]]!= NoEdge && a[x[n]][1]!= NoEdge && 
      (cc + a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc== NoEdge))
    {
      for(int i=1; i<=n; i++)
        bestx[i] = x[i];
      bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];
    }
    return;
  }
else 
  {
    for(int i=t; i<=n; i++)
    {
      if(a[x[t-1]][x[i]]!= NoEdge &&
        (cc + a[x[t-1]][x[i]]< bestc||bestc == NoEdge))
      {
        swap(x[t],x[i]);
        cc += a[x[t-1]][x[t]];
        Backtrack(t+1);
        cc -= a[x[t-1]][x[t]];
        swap(x[t],x[i]);
      }
    }
  }
}
 

3.分支限界法求解的过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//旅行商问题分支限界法的实现
template <class Type>
Type Traveling<Type>::BBTSP(int *v, Type **G, int tn, Type tNoEdge)
{
    priority_queue<MinHeapNode<Type> > pq;
    MinHeapNode<Type> E, N;
    Type bestc, cc, rcost, MinSum, *MinOut, b;
    int i, j;
 
    a = G;
    n = tn;
    NoEdge = tNoEdge;
    MinSum = 0;                                             //最小出边费用和
    MinOut = new Type[n+1];                                 //计算MinOut[i]=顶点i的最小出边费用
    for(i = 1; i <= n; i++)
    {
        MinOut[i] = NoEdge;
        for(j = 1; j <= n; j++)
            if(a[i][j] != NoEdge && (a[i][j] < MinOut[i] || MinOut[i] == NoEdge))
                MinOut[i] = a[i][j];
        if(MinOut[i] == NoEdge)                             //无回路
            return NoEdge;
        MinSum += MinOut[i];
    }
    //初始化
    E.s = 0;
    E.cc = 0;
    E.rcost = MinSum;
    E.x = new int[n];
    for(i = 0; i < n; i++)
        E.x[i] = i+1;
    bestc = NoEdge;
    //搜索排列空间树
    while(E.s < n-1)                                        //非叶结点
    {
        if(E.s == n-2)                                      //当前扩展结点是叶结点的父结点 再加2条边构成回路
        {                                                   //所构成回路是否优于当前最优解
            if(a[E.x[n-2]][E.x[n-1]] != NoEdge && a[E.x[n-1]][1] != NoEdge &&
            (E.cc+a[E.x[n-2]][E.x[n-1]]+a[E.x[n-1]][1] < bestc || bestc==NoEdge))
            {
                //费用更小的路
                bestc = E.cc + a[E.x[n-2]][E.x[n-1]] + a[E.x[n-1]][1];
                E.cc = bestc;
                E.lcost = bestc;
                E.s++;
                pq.push(E);
            }
            else
                delete []E.x;                               //舍弃扩展结点
        }
        else                                                //产生当前扩展结点儿子结点
        {
            for(i = E.s+1; i < n; i++)
                if(a[E.x[E.s]][E.x[i]] != NoEdge)
                {
                    //可行儿子结点
                    cc = E.cc + a[E.x[E.s]][E.x[i]];        //当前费用
                    rcost = E.rcost - MinOut[E.x[E.s]];     //更新最小出边费用和
                    b = cc + rcost;                         //下界
                    if(b < bestc || bestc == NoEdge)        //子树可能含最优解 结点插入最小堆
                    {
                        N.s = E.s + 1;
                        N.cc = cc;
                        N.lcost = b;
                        N.rcost = rcost;
                        N.x = new int[n];
                        for(j = 0; j < n; j++)
                            N.x[j] = E.x[j];
                        N.x[E.s+1] = E.x[i];                //获得新的路径
                        N.x[i] = E.x[E.s+1];
                        pq.push(N);                         //加入优先队列
                    }
                }
 
            delete []E.x;                                   //完成结点扩展
        }
        if(pq.empty())                                      //堆已空
            break;
        E = pq.top();                                       //取下一扩展结点
        pq.pop();
    }
 
    if(bestc == NoEdge)                                     //无回路
        return NoEdge;
    for(i = 0; i < n; i++)                                  //将最优解复制到v[1:n]
        v[i+1] = E.x[i];
    while(pq.size())                                        //释放最小堆中所有结点
    {
        E = pq.top();
        pq.pop();
        delete []E.x;
    }
 
    return bestc;
}

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

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

相关文章

PostgreSQL下载和安装教程

PostgreSQL下载和安装嘚吧嘚下载安装配置pgAdmin设置中文安装中遇到的问题The database cluster initialisation failed.问题描述解决方法嘚吧嘚 公司在用PostgreSQL数据库&#xff0c;和MySQL一样是免费试用的。虽然不知道公司出于什么考虑没有选择MySQL&#xff0c;而是选用…

【户外】东莞-银瓶山-常规路线-登山游记+攻略

不想看流水的请直接看最后攻略 此次路线&#xff1a;北上南下。累计行走约11.57km. 2022/11/20 周日 东莞最近YQ严重&#xff0c;不是拉去Jiankang驿站&#xff0c;就是居家GeLi&#xff0c;加上工作也郁闷&#xff0c;出去走走。 昨晚两点睡觉&#xff0c;在给各种设备补电量…

qq录屏快捷键是什么?qq录屏声音设置

我们日常生活中&#xff0c;有时会突然遇到需要用电脑录制屏幕的情况&#xff0c;这个时候我们可以通过按下qq录屏的快捷键进行录屏。有些小伙伴就有疑问了&#xff0c;电脑qq录屏快捷键是什么&#xff1f; qq录屏声音如何设置&#xff1f;别急&#xff0c;接下来小编给大家详细…

SpringMVC跳转

转发&#xff1a; 1&#xff1a;添加成功跳转到成功页面&#xff0c;给出提示&#xff0c;失败跳转到失败页面 ---- jsp 2&#xff1a;添加成功后&#xff0c;跳转到查询的controller中 -- 另外一个程序&#xff0c;添加完成之后&#xff0c;执行查询所有的操作&#xff0c…

Linux环境基础开发工具使用

Linux环境基础开发工具使用 文章目录Linux环境基础开发工具使用1.Linux软件包管理器 yum1.1 什么是软件包1.2 了解rzsz(文件传输工具)1.3 查看软件包1.4 安装与卸载软件指令1.5 更新yum源2.Linux开发工具介绍2.1 vi/vim开发工具介绍2.2 vi/vim的按键图解3.Linux编辑器---vim的使…

数字信号处理 | 实验二 MATLAB z换和z逆变换分析+求解差分方程+求解单位冲击响应+求解幅频相频特性曲线+求解零极点

1.实验目的 (1)掌握离散时间信号的z变换和z逆变换分析 (2)掌握MATLAB中利用filter函数求解差分方程&#xff1b; (3)掌握MATLAB中利用impz函数求解单位冲击响应h(n); (4)掌握MATLAB中利用freqz函数求解幅频特性曲线和相频特性曲线&#xff1b; (5)掌握MATLAB中利用zplane函…

Spring事务管理 | 数据库连接池流程原理分析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文章目录▌Spring事务管理环境搭建标准配置声明式事务总结▌SqlSessionFactoryXML 中构建 SqlSessionFactory获得 SqlSession 的实例代码实现▌作用域&#xff08;Sco…

2022.11.20 学习周报

文章目录摘要论文阅读1.题目2.摘要3.网络结构3.1 网络示意图3.2 网络特点4.问题的提出5.正则化带有LSTM单元的RNNs5.1 LSTM单元5.2 具有 Dropout 的正则化6.实验6.1 语音建模6.2 语音识别6.3 机器翻译6.4 图像字幕生成7.结论深度学习Pytorch实现简单的RNN总结摘要 This week, …

总账科目 前台操作关事务代码及操作要点

目录 1、维护会计科目相关代码及要点 2、公司代码中的科目参数详解 1、维护会计科目相关代码及要点 事务代码&#xff1a;FSP0 在科目表中维护科目 操作例子&#xff1a;创建1001010100 现金-人民币 及40010001实收资本. 点保存后成功展示如下图 注意&#xff0c;后台必须的…

treeSelect树组件设置父节点禁用

前言&#xff1a; 项目开发中需求方提了这样一个需求&#xff1a;下拉框数据是树形结构&#xff0c;但父节点禁止点选&#xff0c;只能点击子节点。毫无疑问&#xff0c;选用的是 ant design vue 组件库的 treeSelect 组件。但该组件默认每一级节点都可以进行选择&#xff0c;…

Vagrant+VirtualBox快速搭建Linux环境

VagrantVirtualBox快速搭建Linux环境虚拟机Oracle VM VirtualBoxVMware虚拟机的选择Vagrant介绍Vagrant安装centos7虚拟机固定ip配置允许账号密码登录Xshell 连接Vagrant生成的虚拟机虚拟机 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功…

通过docker部署grafana和mysql

1. 简介2. 网络设置 - 2.1 docker网络设置 - 2.2 防火墙设置3. MySQL - 3.1 启动MySQL - 3.2 配置mysql - 3.3 创建只读用户 - 3.4 创建数据库4. Grafana - 4.1 启动Grafana - 4.2 配置数据源 - 4.3 dashboard与panel5. 参考 1. 简介 grafana是一个数据可视化程序, 可通过浏览…

python gdal geopandas basemap cartopy安装

python彻底解决Basemap cartopy geopandas 安装问题 Basemap cartopy geopandas rasterio这几个库存在一定的依赖关系&#xff0c;由于环境的变化 很可能哪天不知道就报错了&#xff1a; 版本不一致&#xff0c;运行也可能报错&#xff0c;如GDAL3.0的主要变化在于对空间参考…

13. PyQt5实现多页面切换之QTabWidget

PyQt5实现多页面切换之QTabWidget QTabWidget 类直接继承自 QWidget。该类提供了一个选项卡栏(QTabBar)和一个相应的页面区域&#xff0c;用于显示与每个选项卡相对应的页面。 与 QStackedLayout 布局原理相同&#xff0c;只有当前页面(即可见页面)是可见的&#xff0c;所有其他…

Flutter 动态更改应用程序启动图标

Flutter 动态更改应用程序启动图标 前言 在这篇文章中&#xff0c;我们将讨论如何在运行时在我们的 flutter 应用程序中动态更改多个应用程序启动器图标。 依赖包 一个用于动态更改移动平台上应用程序图标 flutter 插件。 https://pub.dev/packages/flutter_dynamic_icon 正文 …

zk客户端连接关闭服务端,查看znode(重补早期的学习记录)

前言:之前早期学习记录没有发布成功,丢在草稿里了,今天看到重新补一下。用作学习记录 启动zookeeper ./zkServer.sh start 连接客户端 ./zkCli.sh 后面不需参数,直接回车 回车后,这里有个watcher事件,已连接上localhost端口是默认端口2181 查看有什么命令可用 help 查…

C++类与动态内存分配

11.10 类与动态内存分配 通常&#xff0c;最好是在程序运行时(而不是编译时)确定诸如使用多少内存等问题。对于在对象中存储姓名来说&#xff0c;通常的C方法是&#xff0c;在类构造函数中使用new运算符在程序运行时分配所需的内存。为此&#xff0c;通常的方法是使用string类…

轻松解决VS配置OpenCV环境

一、OpenCV配置 1.下载OpenCV 点击进入下载OpenCV的官网界面 这里以Windows为例&#xff0c;其他同理。&#xff08;可直接下载最新&#xff09; 2.提取OpenCV 在这里浅说一句&#xff0c;为了方便环境配置文件管理&#xff0c;可以把所有关于环境配置的文件夹都放到一个叫e…

周杰伦在某手、腾格尔在某音同时开线上演唱会,八点开始谁流量高

周杰伦和腾格尔&#xff0c;都是中国华语乐坛的风云人物&#xff0c;两个人的江湖地位&#xff0c;一时之间很难分出仲伯。既然两位都是音乐界的老前辈&#xff0c;他们也准备开启历史之先河&#xff0c;两个人的线上演唱会都计划在今晚的八点开始。 虽然都是在今晚八点开启&am…

【微服务解耦之事件启动】Spring Boot 解耦之事件驱动

一、前言 简介&#xff1a; 在项目实际开发过程中&#xff0c;我们有很多这样的业务场景&#xff1a;一个事务中处理完一个业务逻辑后需要跟着处理另外一个业务逻辑&#xff0c;伪码大致如下&#xff1a; Service public class ProductServiceImpl {...public void saveProdu…