【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

这篇具有很好参考价值的文章主要介绍了【中级软件设计师】—(针对上午题)算法分析与设计(三十八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

一、回溯法

1. 什么是回溯法?

相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教,都知道走迷宫的策略是:

当遇到一个岔路口,会有以下两种情况:

存在没走过的路。此时可以任意选一条没走过的路深入,只要记住我们所走过的路径即可。

倘若下次再来到这个路口,便不再沿着走过的路径继续深入,而是沿着没走过的路径深入下去;

所有路都已经走过。如果所有岔路口都已经遍历,则回退至上一个最近的岔路口。

当遇到死胡同,便回退到刚才距离最近的岔路口。

不断前进并重复该过程,直到找到终点或回退到起点位置。

其实,这就是回溯法:一个基于深度优先搜索和约束函数的问题求解方法。

(1)、n皇后问题

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

📢 非递归求解n皇后问题

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define N 4

int q[N + 1]; // 存储皇后的列号

int check(int j)
{ // 检查第i个皇后的位置是否合法
    int i;
    for (i = 1; i < j; i++)
    {
        if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))
        { // 判断是否在同一斜线上
            return 0;
        }
    }
    return 1;
}

void queen()
{ //
    int i;
    for (i = 1; i <= N; i++)
    {
        q[i] = 0;
    }
    int answer = 0; // 方案数
    int j = 1;      // 表示正在摆放第j个皇后
    while (j >= 1)
    {
        q[j] = q[j] + 1; // 让第j个皇后向后一列摆放

        while (q[j] <= N && !check(j))
        {                    // 判断第j个皇后的位置是否合法
            q[j] = q[j] + 1; // 不合法就往后一个位置摆放
        }
        if (q[j] <= N)
        { // 表示第j个皇后的找到一个合法的位置
            if (j == N)
            { // 找到了一组皇后的解
                answer = answer + 1;
                printf("放案%d:", answer);
                for (i = 1; i <= N; i++)
                {
                    printf("%d", q[i]);
                }
                printf("\n");
            }
            else
            { // 继续摆放下一个皇后
                j = j + 1;
            }
        }
        else{ // 表示第j个皇后找不到一个合法的位置
            q[j] = 0;  // 还原第j个皇后的位置
            j = j - 1; // 回溯
        }
    }
}
int main()
{
    queen();
    return 0;
}

📢 递归求解n皇后问题

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define N 4

int answer=0;

int q[N + 1]; // 存储皇后的列号

int check(int j)
{ // 检查第i个皇后的位置是否合法
    int i;
    for (i = 1; i < j; i++)
    {
        if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))
        { // 判断是否在同一斜线上
            return 0;
        }
    }
    return 1;
}

void queen(int j){
    int i;
    for(i=1;i<=N;i++){
        q[j]=i;
if(check(j)){// 当摆放的皇后位置为合法时
    if(j==N){//找到了N皇后的一组解
        answer=answer+1;
        printf("方案%d:",answer);

        for(i=1;i<=N;i++){
            printf("%d",q[i]);
        }
        printf("\n");
    }else{
        queen(j+1);//递归摆放下一个位置
    }
}
    }
}

 
int main()
{

 queen(1);

    return 0;
}

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

二、分治法

递归的概念
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
分治法的基本思想
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

2

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

3

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

4

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

5

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

三、动态规划

动态规划法的基本思想:

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

动态规划—背包问题

01背包问题

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

#include <stdio.h>

#define N 4 // 物品数量
#define W 5 // 背包容量

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    int v[] = {0, 2, 4, 5, 6}; // 物品价值数组
    int w[] = {0, 1, 2, 3, 4}; // 物品重量数组

    int f[N + 1][W + 1] = {}; // 子问题解数组

    int i, j;
    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= W; j++)
        {
            f[i][j] = f[i - 1][j]; // 默认不选第i个物品
            if (j >= w[i])
            { // 选第i个物品的前提条件
                // 等于  不选第i个物品 和选第i个物品 两者的较大值
                f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
            }
        }
    }
    printf("%d\n", f[N][W]);

    for (i = 0; i <= N; i++)
    {
        for (j = 0; j <= W; j++)
        {
            printf("%d", f[i][j]);
        }
        printf("\n");
    }
    return 0;
}

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

0-1背包问题时间复杂度和空间复杂度

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

6

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

7

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

8

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

9

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
📢矩阵相乘问题:算法策略动态规划法,时间复杂度为O(n^3),空间复杂度O(n^2)

10

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

11

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

12

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

记住:
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

四、贪心法

贪心法的基本思想

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

部分背包问题

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
部分背包问题代码实现
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

13😭😭

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

14😭😭

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

15

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)
【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

16

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

答案:C B B A,不理解的看up算法的P31个视频

五、算法总和

📢贪心法

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

📢📢回溯法

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

📢📢📢分支限界法

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

17

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

18

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

19

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

20

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

21

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

22

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)文章来源地址https://www.toymoban.com/news/detail-434199.html

完结 撒花👏👏👏👏

到了这里,关于【中级软件设计师】—(针对上午题)算法分析与设计(三十八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 中级软件设计师备考---软件工程1

    瀑布模型 :最早的一类、适用于需求明确的项目、 结构化 的典型代表 原型模型:先构造一个建议的系统原型再去和用户深入多次交流,不断地根据用户需求进行调整 演化模型:一步步变化,最后得到产品 增量模型:先完成项目的核心功能,然后一步步增加功能 螺旋模型

    2024年02月02日
    浏览(57)
  • 中级软考-软件设计师(三)

    1.netstat -n :可以获取本计算机通过那些端口和外网的IP和端口进行连接; 不能诊断DNS故障 。 state状态: ESTABLISHED:已经建立连接 TIME_WAIT:等待连接 2.SNMP是应用层。 在SNMP协议中,团体名相当于一个组,在进行管理时,是以团体名为单位进行管理的,基作用域也在相同团体名

    2024年02月07日
    浏览(54)
  • 软考:中级软件设计师:大数据

    提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1)自己的科研经历, 科研内容 ,学习的相关领域知识,要熟悉熟透了 (2)自己的实习经历,做了 什

    2024年02月11日
    浏览(60)
  • 软考:中级软件设计师:HTML

    提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1)自己的科研经历, 科研内容 ,学习的相关领域知识,要熟悉熟透了 (2)自己的实习经历,做了 什

    2024年02月11日
    浏览(42)
  • 中级软考-软件设计师(一)

    1.编译和解释 编译器 不参与运行控制 , 解释器 参与运行控制,程序执行的速度慢 。 编译方式 能生成目标程序, 解释方式 不生成。 2.在CPU中,( 运算器,ALU )在控制器下完成算术和逻辑运算。( 累加寄存器,AC )为ALU提供一个工作区,用来暂存数据。( 程序计数器,

    2024年02月04日
    浏览(44)
  • [软考中级]软件设计师-uml

    uml中有4中事物,结构事物,行为事物,分组事物和注释事物 结构事物是uml模型中的名词,通常是模型的静态部分,描述概念或物理元素 行为事物是uml的动态部分,是模型中的动词,描述了跨越时间和空间的行为 分组事物是uml模型中的组织部分,是一些由模型分解成的盒子,

    2024年02月07日
    浏览(60)
  • 软考中级软件设计师主观题详解

    试题 考察内容 数据流图/DFD 补充外部实体、数据存储、加工、数据流等 数据库设计/ER E-R图 关系模式 主键/外键 规范化理论 增加实体 UML建模 类图 用例图 活动图等 C语言算法 C语法+数据结构 Java/C++ 基础语法+设计模式 名词 解释 外部实体 系统外部现实世界存在的物体 矩形表

    2024年02月03日
    浏览(46)
  • 中级软件设计师备考---程序设计语言和法律法规知识

    Fortran语言: 科学计算 、执行效率高 Pascal语言: 为教学而开发的 、表达能力强,演化出了 Delphi C语言:指针操作能力强、 高效 Lisp语言:函数式程序语言、符号处理、 人工智能 C++语言:面向对象、 高效 Java语言:面向对象、中间代码、 跨平台 C#语言:面向对象、中间代码

    2024年02月03日
    浏览(90)
  • 软考:中级软件设计师:数据库模式、ER模型

    提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1)自己的科研经历, 科研内容 ,学习的相关领域知识,要熟悉熟透了 (2)自己的实习经历,做了 什

    2024年02月12日
    浏览(55)
  • 软件设计师_软考中级_下午题笔记(已过)

    数据流图分为顶层数据流图和0层数据流图 顶层数据流图只有一个处理节点即某某系统,顶层数据流图是系统和实体的数据传输表示 0层数据流图是将系统细化 一、数据流图的组成 外部实体(起点,终点) 数据流 处理 数据存储 二、数据流图相关原则 1、顶层图和0层图平衡原则

    2024年02月05日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包