软考(中级)软件设计师核心笔记(9)算法——算法策略

五、算法策略

1、策略概述

|-------|----------------------------|------------------------------------------------------------------------------------------|--------------------------------------------------------|
| 算法 | 关键点 | 特征 | 问题 |
| 分治法 | 递归技术 | 划分,解决子问题,把一个问题拆分成多个小规模的相同子问题,一般用于递归解决 | 斐波那契数列, 归并排序,快速排序 ,矩阵乘法(多个矩阵相乘), 二分搜索 ,大整数乘法,汉诺塔 |
| 贪心法 | 一般用于求满意解,特殊情况可求最优解(部分背包问题) | 局部最优,当前最优,但整体不见得最优。每步有明确的,既定的策略 | 背包问题(如装箱,不能切割),多机调度(任务分配) ,找零钱问题 |
| 动态规划法 | 递归式,最优子结构,中间数组 | 划分子问题(最优子结构),并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果。(一般最顶向下时间复杂度为O(2^n),字底向上时间复杂度为O(n^a)效率更高) | 斐波那契数列, 矩阵乘法,背包问题,LCS最长公共子序列(某一个子序列,即是x的,也是y的,长度最大的序列) |
| 回溯法 | 探索和回退 | 系统的搜索一个问题的所有解或任一解,有试探和回退的功能 | N皇后问题(N*N并限定位置) ,迷宫问题, 背包问题 |

2、分治法

对于一个规模为n的问题,若该问题可以容易解决(规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解

(1):过程

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

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

3.合并:利用该问题分解出的子问题的解,可以合并为该问题的解

(2):解决问题

递归:自己调用自己

1.斐波那契数列:F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2)

int F(int n) {

if(n==0) return 1;

if(n==1) return 1;

if(n>1) return F(n-1)+F(n-2);

}

2.二分查找:查找v值在arr数组中的下标,x表示初始下标,y表示截至下标

int search(int arr\[\], int x, int y, int v) {

if(x > y) return -1;

int m = (x+y)/2;

if(v == arrm) {

return m;

}

else if(v > arrm) {

return search(arr, m+1, y, v);

}

else {

return search(arr,x, m-1, v);

}

}

(3):例题

解:firstSum、 lastSum两变量表示前半部分重量与后半部分重量

>问题一:可以套入实例 偶数1~4 与 奇数1~5 得出答案

(1):last / 2 + 1

(2):firstSum < lastSum

(3):(last - first) / 2 + first

>问题二:分治法、O(log2n)

>问题三:最少2次、最多4次

3、贪心法

局部最优选择(满意解),解决部分背包问题时可以得到最优解

(1):背包问题

固定的容量,放价值最高的内容

b为0-1背包

c为部分背包

设:申请一些场地举办一批活动,每场活动都有开始和结束时间。两场活动的开始与结束时间不交叠视为不冲突。计算n个活动需要的最少场地。

>思路:设场地数m,活动数n,场地集合P1, P2, ······, Pm

1.采用快速排序将活动开始时间从小到大排列,得到活动集合a1, a2, ······, an 。然后重复2、3、4步骤

2.判断场地P1的最后一个活动与ai是否冲突,若冲突,则考虑下一个场地P2 ······

3.若不冲突,则将活动ai安排到场地P1,然后考虑下一场活动

4.若ai与所有已安排活动的场地的最后一个活动都有冲突,则安排一个新的场地给ai

5.将n(n为活动数,开始假设每场活动都冲突,都需要安排一个场地,所以这里n也被计作开始场地数)减去没有安排活动的场地数,则可求得最少场地数

>下表给出n=11的活动集合,则最少场地为5个

P1:1-8-11,P2:2-6-9,P3:3,P4:4-7,P5:5-10

>时间复杂度:由于嵌套了两个for循环ai(活动)及Pj(场地),所以时间复杂度为 O(n^2)

(2):例题

解:

>问题一

分析代码:先将n个任务填充到m个机器当中,再根据每台机器已运行任务的时间最短条件,将下一个(m+)的任务放置到此机器当中

t\[\]//任务列表

s\[\]\[\]//机器任务列表

d\[\]//机器运行时长列表

count\[\]//机器运行任务个数

(1):先将m台机器填满任务,d表示机器运行时长,t表示任务列表时长,所以将机器填满应该将m个任务填充到d当中,所以循环m时,di = ti

(2):分配m之后的任务,也就是将已填充的机器再次叠加填充,所以再次循环时,起始位置应该是m,i = m

(3):当求得k后,表示第k个任务此时可以被填充,count\[\]记录每个机器运行任务的个数,所以将任务添加到s机器任务列表中,skcount\[k] = i

(4):求机器当中最大运行时长,d列表相比较,取最大,所以 di > max

>问题二

(5):分机问题,取局部最优解 = 贪心算法

(6):时间复杂度:根据四段循环代码,求得四段事件复杂度:O(m*n)、O(m)、O(m*n)、O(m),取最大为:O(m*n)

>问题三

(7):将实例套入代码,前三个任务分别放入三段机器,即0-16,0-14,2-6,剩余任务判断条件后放入得出

0# 0

1# 1、5

2# 2、3、4、6

(8):根据(7)结论求出每台机器时间

0# 16

1# 14+3=17

2# 6+5=11+4=15+2=17

找出最大运行时间为:17

4、动态规划法

问题中,如果出现"最优子结构"的描述,并且结构用递归式表示,中间还有数组记录子问题的解,则一般为动态规划法

(2):例题

解:

>问题一:

(1):i (2):i

(3):temp >= (pi + rj-i) ? temp : pi + rj-i

(4):ri = temp

>问题二:

动态规划法(给出递归式)

>问题三:

(6):O(2^n)

(7):O(n^2)

5、回溯法

解决迷宫问题

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

试探部分:满足规则内的所有条件,则扩大规模

回退部分:搜小规模,1.当前规模解不是合法解时进行回溯(不满足约束条件),2.当求完一个解再求下一个解时进行回溯

(1):例题

解:已知数组pos当中值存放为皇后行号,数组下标为列号

>问题一

(1):判断冲突,判断列会产生冲突(行内不会冲突,因为每行只能存在一个皇后)posi == posk

(2):初始化赋值,数组从1开始,j = 1

(3):尝试摆放皇后,如果不满足摆放条件,进入while循环,pos行未达到边界值 并且 当前位置无法摆放皇后(调用isplace方法判断当前位置是否冲突),则继续尝试下一个摆放。isplace(pos, j) == 0

(4):摆放下一个皇后,如果pos行为达到边界值,则可以摆放下一个皇后。j < N

(5):回溯,j = j -1

>问题二:回溯法

>问题三(必须每列都放置皇后):带入实例验证下:方案1-2413,方案2-3142

相关推荐
阿里巴巴首席技术官2 小时前
目标检测基础
笔记·yolo
码匠许师傅3 小时前
【C++ 面试真题】20. 聊聊 C++ 的标准库常用算法
c++·算法·面试
TJHHH.3 小时前
SQL注入学习总结
数据库·笔记·sql·学习·注入
自小吃多3 小时前
Capture软件原理图添加元器件笔记
笔记·嵌入式硬件
m0_547486663 小时前
《数据结构与算法(Python语言版)》全套PPT课件2026
数据结构·算法
TJHHH.3 小时前
文件包含漏洞
笔记·安全·文件包含
个 人 练 习 生4 小时前
数据结构入门:算法复杂度
开发语言·数据结构·经验分享·学习·程序人生·算法
Ricardo-Yang4 小时前
无人机单目深度估计测试:ZipDepth 与 AerialMetric
人工智能·算法·机器学习·计算机视觉·无人机
zjnlswd4 小时前
C# 学习笔记
笔记·学习
Nil2084 小时前
golang解决单词转换
算法