当前位置: 首页 > news >正文

软考 中级软件设计师 考点知识点笔记总结 day08 算法设计与分析

文章目录

      • 算法设计与分析
          • 分治法
          • 动态规划法(整体最优 子问题不独立)
          • 贪心法(局部最优)
          • 回溯法


算法设计与分析

分治法、回溯法、贪心法、动态规划法

分治法

分而治之,对规模为n的问题 分解为k个规模较小的子问题,子问题相互独立且与原问题形式相同,可以递归地解决这些子问题,然后将子问题的解合并得到原问题的解

该问题规模缩小到一定的程度就可以容易地解决

该问题可以分解为若干个规模较小的相同问题

利用该问题分解出的子问题的解可以合并为该问题的解

  • 该问题分解的各个子问题是相互独立的

分治算法在每一层递归上都有3个步骤。

1 分解 将原问题分解成一系列子问题

2 求解 递归地求解各个子问题。若子问题足够小 ,直接求解

3 合并 将子问题的解合并成原问题的解

递归 就是在运行的过程中调用自己。 函数递归带来的内存开销 S(n) = O(n) 空间复杂度等于递归调用的深度

Q 快速排序算法在排序过程中,在待定排序数组中确定一个元素为基准元素,根据基准元素把待排序数组划分成两个部分,前面一部分元素值小于基准元素,而后面一部分元素值大于基准元素,然后再分别对前后两个部分进一步进行划分。根据上面描述,快速排序算法采用了_A 的算法设计策略。已知确定基准元素操作的时间复杂度为O(n), 则快速排序算法最好和最坏的情况下的时间复杂度为 __D

A 分治 B 动态规划 C 贪心 D 回溯

A O(n)和 O(nlongn) B O(n)和 O(n^2) C O(nlgn)和 O(nlgn) D O(nlgn)和 O(n^2)

时间复杂度分析
(1) 最好情况下的时间复杂度
在最好情况下,每次划分都能将数组均匀地分成两部分(即基准元素正好位于中间位置)。此时,快速排序的递归深度为
logn,每一层需要扫描 n 个元素。因此,总的时间复杂度为:
T(n)=O(nlogn)
(2) 最坏情况下的时间复杂度
在最坏情况下,每次划分都极不均匀(例如,基准元素总是最大或最小值,导致一边为空,另一边包含 n−1 个元素)。此时,递归深度为 n,每一层需要扫描
n,n−1,n−2,… 个元素。因此,总的时间复杂度为:T(n)=O(n^2)

动态规划法(整体最优 子问题不独立)

将待求解问题分解成若干个子问题 先求解子问题 然后由子问题的解得到原问题的解 与分治法不同,适用于动态规划法求解的问题,经分解得到的子问题往往不是独立的。

动态规划算法通常用于求解具有某种最优性质的问题,在这类问题中,可能有许多可行解,每个解对应一个值,我们希望找到具有最优值的那个解。

对于一个给定的问题,若具有以下两个性质,可以考虑用动态规划法求解。

  • 最优子结构。如果一个问题的最优解中包含了其子问题的最优解,就说该问题具有最优子结构。当一个问题具有最优子结构时,提示我们动态规划法适用,但此时贪心算法可能也适用
  • 重叠子问题。 指 用来解原问题的递归算法可反复地解同样的子问题 ,而不是产生新的子问题。当一个递归算法不断地调用同一个问题时,就说该问题包含重叠子问题。若用分治法递归求解,则每次遇到子问题都会视为新问题。会极大降低算法效率。而动态规划法利用重叠子问题,对每个子问题仅计算一次,就把解保存在一个需要时就可以查看的表中,每次查表得时间为常数,

Q 考虑一个背包问题,共有n=5个物品,背包容量为W=10,物品的重量和价值分别为:w={2,2,6,5,4},v={6, 3,5,4,6},求背包问题的最大装包价值。若此为0-1背包问题,分析该问题具有最优子结构,其中c(i,j)表示i个物品、容量为j的0-1背包问题的最大装包价值,最终要求解c(n,W)。 采用自底向上的动态规划方法求解,得到最大装包价值为_ C ,算法的时间复杂度为 _A

A 11 B 14 C 15 D 16.67

A O(nW) B O(nlgn) C O(n^2) D O(nlgnW)

6 +6 + 3

动态规划算法需要填充一个大小为 n×Wn×W 的表格,每个单元格的计算时间为 O(1)。因此,总的时间复杂度为:O(nW)

Q 考虑一个背包问题,共有n=5个物品,背包容量为W=10,物品的重量和价值分别为:w={2,2,6,5,4},v={6, 3,5,4,6},求背包问题的最大装包价值。若此为部分背包问题,首先采用归并排序算法,根据物品的单位重量价值从大到小排序,然后依次将物品放入背包直至所有物品放入背包中或者背包再无容量,则得到的最大装包价值为(D),算法的时间复杂度为( B)。

A 11 B 14 C 15 D 16.67

A O(nW) B O(nlgn) C O(n^2) D O(nlgnW)

单位重量价值 6/2 = 3 3/2 = 1.5 5/6 = 0.83 4/5 = 0.8 6/4 = 1.5

贪心装包

与0-1背包问题不同,部分背包问题允许将物品分割,即可以只取物品的一部分以最大化价值。解决部分背包问题的常用方法是:

  1. 按照物品的单位重量价值(即 价值/重量价值/重量)从大到小排序。
  2. 依次选择单位重量价值最高的物品放入背包,直到背包容量耗尽。

依次选择物品放入背包,直到背包装满:

  1. 物品1:重量为2,价值为6。放入后剩余容量为 10−2=8,总价值为 66。

  2. 物品5:重量为4,价值为6。放入后剩余容量为 8−4=4,总价值为 6+6=12。

  3. 物品2:重量为2,价值为3。放入后剩余容量为 4−2=2,总价值为 12+3=15

  4. 物品3

    :重量为6,但剩余容量只有2,因此只能取其一部分。取重量2,对应价值为:

    部分价值=26×5=1.67部分价值=62×5=1.67

    总价值15+1.67=16.6715+1.67=16.67。

此时背包已满,无需继续装入其他物品。

时间复杂度分析
归并排序:对物品按单位重量价值排序的时间复杂度为 O(nlogn)。
贪心装包:依次装入物品的时间复杂度为 O(n)。
因此,总的时间复杂度为:O(nlogn)

注 O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3)< O(2^n) < O(n!) < O(n^n)

贪心法(局部最优)

做出当前来说最好的选择,并不从整体上加以考虑。所作的每步选择都只是当前步骤的局部最优选择。但从整体上来说不一定是最优的选择。由于它不必为了寻找最优解而寻找所有可能解,因此耗费时间少。一般可以快速得到满意的解,但不一定得到最优解,也常用于解决最优化的问题

用贪心法求解的问题一般具有两个重要的性质。

  • 最优子结构 当一个问题的最优解包含子问题的最优解时 称此问题具有最优子结构。问题的最优子结构是该问题可以采用动态规划法或贪心法求解的关键性质
  • 贪心选择性质。 指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择得到。这是贪心法和动态规划法的主要区别
回溯法

回溯法是种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。走不通就退回再走的技术

相关文章:

  • 设计模式 Day 1:单例模式(Singleton Pattern)详解
  • 《Operating System Concepts》阅读笔记:p495-p511
  • argparse的使用
  • 【前端】【React】第四章:深入理解 React Router 及前端路由管理
  • 使用 mpstat 与 stress-ng 进行 CPU 性能监控
  • 从0到1的数据结构教程——深入思考动态数组
  • 记录一下最近参与实习 外包 社招流程里的一些感悟
  • Java EE(18)——网络原理——应用层HTTP协议
  • 内网渗透-网络分离免杀
  • git --- cherry pick
  • 深入解析C++模板:从基础到高级应用
  • AI Agent开发大全第十五课-零售智能导购Agent的代码实现
  • Nginx RTMP 处理模块 (ngx_rtmp_handler.c) 详细分析
  • 1371. 货币系统-dp背包问题
  • Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数>
  • HarmonyOSNext_API16_Tabs组件
  • 架构师面试(二十三):负载均衡
  • Spring AI 实现 STDIO和SSE MCP Server
  • C++ STL常用算法之常用查找算法
  • 智能体的学习(一)
  • 美乐乐 网站建设/深圳市住房和建设局官网
  • 软件设计模式/宁波seo运营推广平台排名
  • 波波网站建设/如何快速搭建一个网站
  • 优化前网站现状分析/上海最新发布最新
  • 网站建设四不问题/宣传软文范例
  • 教育类网站建设方案/台州seo公司