算法分析与设计期末考试复习GDPU

重点内容:

绪论:
简单的递推方程求解  1.19(1)(2) 、 教材例题  
多个函数按照阶的大小排序  1.18            

分治法:
分治法解决芯片测试问题   
计算a^n的复杂度为logn的算法(快速幂) 
分治法解决平面最近点对问题  (增加预处理) 
锦标赛算法求第二大数的步骤(链表)         
分治法S中第k小元素的归约过程      (m*)       

动态规划:
最长公共子序列问题:蛮力法和动态规划的递归方程或递推关系、动态规划的伪码(填空)、优化函数和标记函数(填空)
矩阵链的乘法问题 : 蛮力法和动态规划的递归方程或递推关系、动态规划的伪码(填空)、备忘录和标记函数(填空)
最大子段和

贪心法:4.3  4.4    4.16  4.21  
    主要设计思想、伪码、复杂度、实例求解
贪心法:活动安排问题问题实例求解、最小延迟调度问题实例求解

回溯:
(填空)回溯算法的主要设计步骤,用回溯算法解决图的m着色问题、货郎问题(TSP)
(填空)分支界限的基本下,用分支界限算法解决最大团问题、背包问题

绪论:

多个函数按照阶的大小排序

简单的递推方程求解 

大小关系:指数级>多项式级>对数多项式级>常数级

化简:

主定理

【北大公开课】  算法设计与分析 屈婉玲教授 (76p)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=16&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

教材例题

【北大公开课】  算法设计与分析 屈婉玲教授 (76p)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=17&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

分治法:

分治法解决芯片测试问题   

问题描述

一次测试过程:

两片都是好结果,就留一片。其他情况全丢掉

蛮力算法时间复杂度

蛮力算法的判断好坏标准(一片芯片怎么判断好坏)

n为奇数情况

n为偶数情况

结论还是不变

分治法

假设 n为偶数,将 n片芯片两两一组做 测试淘汰,剩下芯片构成子问题,进 入下一轮分组淘汰。(类似锦标赛)

分治命题正确性

时间复杂度

主定理第三种情况ヽ(ー_ー)ノ直接记吧

计算a^n的复杂度为logn的算法(快速幂) 

迭代伪码

输入:底数a,指数n

输出:计算完成的结果result

result=1; //用于存储结果

while n不为0时 do

        if n % 2 == 0 then

                result =result *a        //奇数需多乘一次底数

        a=a*a;

        n/=2;
return result

递归伪码

输入:底数a,指数exponent

输出:计算完成的结果

function fastpow(a, exponent):
    if exponent == 0
        then return 1
    if exponent == 1
        then return a
    temporary <- fastpow(a, exponent/2)
    if exponent % 2 == 0
        then return (temporary  * temporary) 
    else
        return (temporary * temporary * a) 

时间复杂度

分治法解决平面最近点对问题  (增加预处理) 

伪码

直接看课吧【【北大公开课】  算法设计与分析 屈婉玲教授 (76p)】icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Ls411W7PB/?p=25&share_source=copy_web&vd_source=7ffbd7feaeedb3d59fb21e59435a53d8

未改进的算法时间复杂度

改进:增加预处理

括号里面是第几个点,比如-2(3)就是横坐标x=-2,第p3点

改进后算法的时间复杂度

锦标赛算法求第二大数的步骤(链表)         

题目描述&蛮力算法时间复杂度

锦标赛算法

伪代码

7是第二小

时间复杂度

算法比较分为两部分:第一部分是找最大元素max的比较次数,显然为n-1;第二部分是在产生max后链表中找最大所需的比较次数。

分治法S中第k小元素的归约过程      (m*)       

问题描述

简单的算法(k次最小算法 or 排序后输出)

分治算法

每一组就是一列,先排序,上面大下面小

8,7,10,4不确定大小,所以要和m*比较

伪代码 

时间复杂度

动态规划:

最长公共子序列问题:

蛮力法的时间复杂度O(n*2^{m})

#include <iostream>
#include <string>
using namespace std;string lcs_bruteforce(const string& X, const string& Y) {int m = X.length();int n = Y.length();if (m == 0 || n == 0) {return "";} else if (X[m-1] == Y[n-1]) {return lcs_bruteforce(X.substr(0, m-1), Y.substr(0, n-1)) + X[m-1];} else {string lcs1 = lcs_bruteforce(X.substr(0, m-1), Y);string lcs2 = lcs_bruteforce(X, Y.substr(0, n-1));if (lcs1.length() > lcs2.length()) {return lcs1;} else {return lcs2;}}
}int main() {string X = "ABCBDAB";string Y = "BDCAB";string lcs = lcs_bruteforce(X, Y);cout << "The longest common subsequence is: " << lcs << endl;return 0;
}

参考代码

动态规划的递归方程或递推关系

✨代码实现: 

【算法设计与分析MOOC-青岛大学-张公敬教授】

动态规划的伪码(填空)

动态规划时间复杂度O(m*n)

追踪解时间复杂度O(m + n)

优化函数(填空)

X = 【1, 2, 3】, Y = 【1, 3】按照下图关系推

标记函数(填空)

b数组用来设立标记,算法结束后可以利用这些标记追踪最优解。

例子:

怎么推?
c[i][j]矩阵:

按照信息表即可推出b矩阵(数组)

 如何追踪解? 
b[i][j]为1时,对应X、Y序列第i行,j列中的元素

矩阵链的乘法问题:

蛮力法的时间复杂度\Omega(2^{2n}/{n^{\frac{3}{2}}})

动态规划的递归方程或递推关系

动态规划的伪码(填空)

递归实现:

时间复杂度

迭代实现:

备忘录(填空)

看着递推方程来填空

自己复制代码,断点调试设置变量查看吧

#include <bits/stdc++.h>
using namespace std;
//输入:矩阵链Ai…j的输入为向量P=<Pi-1,Pi,…,Pj>,其中:1<=i<=j<=n.
//输出:计算Ai…j的所需最小乘法运算次数m[i,j]和最后一次运算位置s[i,j]。
const int N = 101;
int m[N][N], s[N][N];
int a[] = {30, 35, 15, 5, 10, 20};void MatrixChain(int a[N], int n)
{for(int i=1; i<=n; i++)m[i][i] = 0;for(int r=2; r<=n; r++){for(int i=1; i<= n-r+1; i++){int j = i+r-1;m[i][j] = m[i+1][j] + a[i-1]*a[i]*a[j];s[i][j] = i;for(int k=i; k<=j-1; k++){int t = m[i][k] + m[k+1][j] + a[i-1]*a[k]*a[j];if(t < m[i][j]){m[i][j] = t;s[i][j] = k;}}}}
}int main()
{MatrixChain(a, 6);cout << "The number of least multiplication operations:" << endl;cout << m[1][5] << endl;cout << "Position of the last operation:" << endl;cout << s[1][5] << endl;cout << "array s:" << endl;for(int i=1; i<=5; i++){for(int j=1; j<=5; j++){cout << s[i][j] << ' ';}cout << endl;}return 0;
}

标记函数(填空)

记录k的值,k就是分割线

最大子段和

力扣(LeetCode)53.最大子数组和

蛮力算法O(n^2--n^3)

O(n^{3})

改进后O(n^{2})

分治算法O(nlogn)

思路:一路分分分,分到只有左边一个和右边一个的时候开始计算。分治区间左右两半分别求和放好(leftsum, rightsum),还有一个跨边界,把边界左边(整个数组第一个元素)和右边(整个数组最后一个元素)全加起来

分治区间:当前递归函数所计算的左右区间


代码: 

————————————————
版权声明:图片为博主原创文章摘录
链接:https://blog.csdn.net/weixin_73523694/article/details/134515793 

动态规划算法

类似前缀和思想,判断前一个数是否大于0,不是就不加,是就加,当前数+前一个数。以达到最大和的目的

时间复杂度O(n),空间复杂度O(n)

伪代码写成代码: 

int MaxInterval(vector<int> a, int len) {vector<int> dp(len);int res = -INF;dp[0] = a[0];for(int i = 1; i < len; i ++ ) {dp[i] = max(a[i], dp[i - 1] + a[i]);res = max(res, dp[i]);}return res;
}

贪心法:

4.3

最坏情况下的时间复杂度函数

主要设计思想、伪码、复杂度、实例求解 

这是一个经典的区间覆盖问题,可以通过贪心算法来解决。我们的目标是用最少的基站覆盖所有房子,且每个房子都在至少一个基站的左右4千米范围内。

主要设计思想

1. 贪心策略:为了覆盖最多的房子,每次选择离A(起点)最近尚未被覆盖的房子。房子的位置+4km作为新基站的位置。这样可以确保新基站能覆盖最多未被覆盖的房子。
2. 迭代过程:从房子A开始,依次考虑每个房子,如果当前房子不在已有基站的覆盖范围内,则在其位置往后4km设置新的基站。
3. 覆盖检查:对于每个房子,检查是否已经在任意基站的4千米范围内。如果是,则该房子已被覆盖;如果不是,则需要在新的位置设置基站。

伪码
输入:房子距离A的列表distances[1...n]
输出:基站位置列表base_stations

初始化基站位置列表base_stations为空

对房子距离A的列表进行升序排序
base_stations[1] <- distances[1]+4

for i = 1 to n do
    rightpoint <- base_stations[i]+4
    if distances[i] > rightpoint then
            基站位置列表base_stations添加设置新基站位置distances[i]+4

return base_stations

课本答案:

时空复杂度分析

        时间复杂度:最坏情况下,我们需要遍历所有的房子来检查是否已经被覆盖,因此时间复杂度为O(n),其中n是房子的数量。
        空间复杂度:除了输入的距离列表,我们还需要存储基站位置列表,因此空间复杂度为O(n)。

实例求解

假设房子到A的距离分别是[0, 5, 10, 15]千米。按照上述算法:

1. 从房子A开始,设置基站1(位置0+4千米),覆盖范围[0, 8]千米。房子B(位置5千米)在覆盖范围内。
2. 房子C(位置10千米)不在覆盖范围内,设置基站2(位置10+4千米),覆盖范围[10, 18]千米。房子D(位置15千米)在覆盖范围内。

最终基站位置为[4,14]千米。

这个算法通过贪心策略确保了使用最少数量的基站来覆盖所有的房子,同时满足每个房子都在至少一个基站的4千米范围内。

4.4  

题目:

主要设计思想、伪码、复杂度、实例求解

这是一个典型的区间覆盖问题,我们可以通过贪心算法来解决这个问题。算法步骤如下

设计思想

        由于点已经按照从小到大的顺序排列,我们可以直接从最小的点开始,每次都尽可能选择包含更多未被覆盖的点的闭区间。具体步骤如下:

1. 初始化闭区间集合为空,当前覆盖的点集也为空。
2. 从未被覆盖的点中选择最小的一个作为新闭区间的左端点。
3. 向右扩展这个长度为1闭区间直到不能覆盖更多的点为止。
4. 将这个闭区间加入到闭区间集合中,记录个数和位置,并将覆盖的点标记为已覆盖。
5. 重复步骤2-4,直到所有的点都被覆盖。

伪码
输入:点集x1, x2, ....., xn
输出:闭区间集合

初始化闭区间集合S为空

for i=1 to n do
    选择未被覆盖的最小点x_i
    设置闭区间右端点right <- x_i + 1
    while x_i+1 < right do
        i <- i+1; (i++的意思)
    将[x_i, right]添加到S

end for

时空复杂度分析

        时间复杂度:算法需要遍历所有的点来确定每个闭区间,因此时间复杂度为O(n),其中n是点的数量。
        空间复杂度:除了输入的点集外,我们需要存储每个闭区间集合位置,因此空间复杂度也是O(n)。

实例求解

假设给定的点集为{1,2,3,7,8,9},按照上述算法:

  • 对于点1,2,闭区间是[1, 2]
  • 对于点3,闭区间是[3, 4]
  • 对于点7,8,闭区间是[7, 8]
  • 对于点9,闭区间是[9, 10]

最终得到的闭区间集合是{[1,2],[3,4],[7,8],[9,10]},闭区间个数4个。覆盖了所有的点。

这个算法确保了每个点都被一个长度为1的闭区间覆盖,满足了题目的要求。

课本答案:

4.16

主要设计思想、伪码、复杂度、实例求解

设计思想:双指针算法(贪心)

算法的核心思想是利用两个指针分别遍历序列A和B。由于B是A的子序列,因此B中的每个元素都必须按顺序出现在A中。我们可以通过比较两个序列当前指针所指向的元素来检查这一点。如果B的当前元素与A的当前元素匹配,则将B的指针向前移动一位;无论是否匹配,A的指针都向前移动一位。如果B的指针移动到了序列末尾,说明B是A的子序列。

课本答案:

伪码:
算法4.16 IsSubsequence
输入:A、B两个序列
输出:如果B是A的子序列,输出True;否则返回False
i <- 0
j <- 0
while i < n and j < m do
        if A[i] == B[j] then
            j <- j+1
        i <- i+1

if j == m then
       Return True
else
       Return False

时空复杂度分析:

时间复杂度为O(n),因为最坏的情况下,我们需要遍历整个A序列一次。
空间复杂度为O(1),因为我们只使用了常数个辅助变量。

实例求解:

假设A = [1, 2, 3, 4, 5],B = [2, 4]。

- 初始化i = 0, j = 0。
- 比较A[0]与B[0],不匹配,i = 1。
- 比较A[1]与B[0],匹配,i = 2, j = 1。
- 比较A[2]与B[1],不匹配,i = 3。
- 比较A[3]与B[1],匹配,i = 4, j = 2。
- 此时j已经等于B的size,说明B是A的子序列。

因此,算法判断B是A的子序列是正确的。

4.21  

题目:

主要设计思想、伪码、复杂度、实例求解

设计思想:

伪码:
算法4.21 FindSmallestSet(A)
输入:n个集合A1,...,An。
输出:最小的满足条件的集合S。
对n个集合的右端点b进行升序排序
A[1]作为一个交集,加入S
x <- A[1].b1
for i <- 1 to n do

        if A[i]的左端点小于当前交集右端点x then
                选一个集合A[i]作为一个交集,加入S
                x <- A[i].bi
return S

课本答案:

bi就是右端点

 

时空复杂度分析:

时间复杂度为O(nlogn),因为需要对集合进行排序。
空间复杂度为O(n),用于存储集合S。

实例求解:

假设有集合 A1 = [1, 3],  A2 = [2, 6],  A3 = [7, 10],  A4 = [8, 9]。

- 对n个集合的右端点进行升序排序,A1,A2,A4,A3。
- 选择A1,加入S中。由于A2左端点小于A1右端点,所以删除A2
- 选择A4,加入S中。由于A3左端点小于A4右端点,所以删除A3
- 返回S = {A1, A4}作为最小集合,满足每个Ai至少含有S中的一个数。

活动安排问题实例求解

如果第二个活动的开始时间大于第一个活动的结束时间,就加入集合A

先按照起始时间排序

最小延迟调度问题实例求解

题目P91

回溯:

回溯算法的主要设计步骤

用回溯算法解决图的m着色问题

搜索策略:深度优先

时间复杂度O(nm^{n})

第一个解向量:< 1, 2, 1, 3, 1, 2, 3 >。根据对称性,只需搜索 1/3 的解空间. 当点1和点2确定, 即 以后,只有1个解,点2为根的子树中也只有1个解。由于3个子树的对称性,总共6个解。
对称性:3的地方换成2,2的地方换成3

货郎问题(TSP)旅行售货员问题

定义(题目)

解向量 & 约束条件 & 搜索空间(子结点排列规则)

【【北大公开课】  算法设计与分析 屈婉玲教授 (76p)】

太多不更了,看视频吧

分支限界

相关概念

      目标函数(极大化或极小化)

      约束条件(解满足的条件)

      可行解: 搜索空间满足约束条件的解

      最优解: 使得目标函数达到极大 (或极小)的可行解


用分支限界算法解决最大团问题

题目

代价函数

实例

来不及就直接背吧

用分支限界算法解决背包问题

题目:

代价函数

\Delta是理想情况下,每一个小空隙都装第k+1件物品。实际情况是第k+1件物品塞不满这些空隙的

分支策略:深度优先

界函数

界函数初始值0,到达橙色框后得到了更好的可行解,就更新界函数的值为12。
之后的深度搜索中,当代价函数大于界函数时,继续向下搜索。当代价函数小于界函数时,就可以停止向前了,因为往下也得不到更好的,这已经是下面的叶子结点中最大的一个代价函数值

习题 

【算法分析与设计】【期中(末)复习题】【2022秋】

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

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

相关文章

OpenCV单词轮廓检测

OpenCV单词轮廓检测 0. 前言1. 策略分析2. 检测字符轮廓3. 检测单词轮廓相关链接 0. 前言 在根据文档图像执行单词转录时&#xff0c;通常第一步是识别图像中单词的位置。我们可以使用两种不同的方法识别图像中的单词&#xff1a; 使用 CRAFT、EAST 等深度学习技术使用基于 O…

用Python处理Excel的资源

用Python处理Excel的资源 python-excel 读写Excel文件 openpyxl openpyx文档l 读写Excel2010文件&#xff08;即xlsx&#xff09; openpyxl示例&#xff1a; from openpyxl import Workbook wb Workbook()# 获取active worksheet ws wb.active# 给单元格赋值 ws[A1] 4…

I/O Stream设计实验

实验要求和目的 深入理解java输入输出流相关类的基本用法&#xff0c;并且可以掌握Java程序的编写和调试。 实验环境 Java语言&#xff0c;PC或android平台 实验具体内容 设计和编写以下程序&#xff1a; 程序1&#xff1a; 从键盘读入多行字符串&#xff08;英文&#xf…

农情监测系统的工作原理

TH-Q3农情监测系统是指利用现代信息技术手段&#xff0c;对农田环境进行实时监测、数据采集、传输和处理&#xff0c;以实现对农田环境的全面感知和智能管理[1]。该系统通过安装各种传感器和监测设备&#xff0c;能够实时监测农田的气象、土壤、植被和其他相关数据&#xff0c;…

VXLAN技术揭秘:实现大规模网络隔离与虚拟机无缝迁移

VXLAN简介 定义 VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;是由RFC定义的一种VLAN扩展方案。VXLAN采用MAC in UDP&#xff08;User Datagram Protocol&#xff09;封装方式&#xff0c;是NVO3&#xff08;Network Virtu…

KOL营销策略:危机公关中的品牌修复与形象重塑

在当今数字化时代&#xff0c;品牌声誉的管理和维护愈发重要。危机公关作为品牌管理的重要一环&#xff0c;对于企业的长期生存和发展具有至关重要的影响。而KOL作为具有强大影响力和号召力的个体&#xff0c;在危机公关中扮演着不可或缺的角色。本文Nox聚星将和大家探讨KOL在危…

男士内裤哪个牌子质量好又舒服?2024男士内裤舒适度排行

男士内裤&#xff0c;不仅仅是一件简单的衣物&#xff0c;更是健康与舒适的关键守护者。作为每位男士的私密伙伴&#xff0c;它承载着每一天的舒适体验与健康保障。因此&#xff0c;选择一款合适的内裤&#xff0c;对男士们来说&#xff0c;显得尤为重要。 我们为您精心总结了…

国标GB28181安防视频监控EasyCVR平台级联时上级平台不显示通道是什么原因?

国标GB28181安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有GA/T 1400、国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 有用户反馈&#xff…

Linux 基本指令1

ls指令 ls【-选项】【目录或文件】当不指定目录或文件时指令能列出当前目录下所有文件除隐藏文件 选项&#xff1a; -a 列出所有包括隐藏的文件-隐藏文件以.开头。 -d 将目录如文件般显示-一般用ls显示目录是显示其目录中所有文件&#xff0c;加-d则显示目录的信息 -r 以反…

22 CRT工具安装流程

22 CRT工具安装流程 SecureCRT 9.5 说明书 SecureCRT 9.5是一款由VanDyke Software开发的终端仿真程序。它为Windows、Mac和Linux操作系统提供了强大的SSH&#xff08;Secure Shell&#xff09;客户端功能。SecureCRT 9.5提供了对Telnet、RLogin、Serial和X.509等协议的支持&…

【安卓设备】通过adb批量安装apk

1、adb链接设备 H:\tv\apk>adb connect 127.0.0.1:21503 2、批量安装apk 如果地址不一致需要将 H:\tv\apk\ 改成自己的路径地址&#xff0c;同时注意该命令只能安装文件名为英文的不支持中文名称&#xff0c;如果有需要先更改文件名称。 H:\tv\apk>for %f in (H:\tv\a…

技术速递|介绍 .NET API 文档的源代码链接

作者&#xff1a;Min Huang&#xff0c;Matt Trilby-Bassett 排版&#xff1a;Alan Wang 开发人员在阅读 API 参考文档时&#xff0c;有时会需要或希望查看相应的源代码。直到不久之前&#xff0c;.NET API 参考文档还没有提供指向源代码的链接&#xff0c;这引起社区添加这一功…

借助ChatGPT撰写学术论文,如何设定有效的角色提示词指

大家好&#xff0c;感谢关注。这个给大家提供关于论文写作方面专业的讲解&#xff0c;以及借助ChatGPT等AI工具如何有效辅助的攻略技巧。有兴趣的朋友可以添加我&#xff08;yida985&#xff09;交流学术写作或ChatGPT等AI领域相关问题&#xff0c;多多交流&#xff0c;相互成就…

12. Django 第三方功能应用

12. 第三方功能应用 因为Django具有很强的可扩展性, 所以延伸了第三方功能应用. 通过本章的学习, 读者能够在网站开发过程中快速实现API接口开发, 验证码生成与使用, 站内搜索引擎, 第三方网站实现用户注册, 异步任务和定时任务, 即时通信等功能.12.1 Django Rest Framework框…

【区块链】记账的千年演化:从泥板到区块链

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 记账的千年演化&#xff1a;从泥板到区块链引言一、古代记账&#xff1a;泥板与…

2024 年勒索软件将比以往更加残酷

如今&#xff0c;世界各地的人们去学校、去医院或去药店时&#xff0c;都会被告知&#xff1a;“抱歉&#xff0c;我们的计算机系统瘫痪了。” 罪魁祸首往往是在世界另一端活动的网络犯罪团伙&#xff0c;他们会要求人们支付系统访问费用或安全归还被盗数据。 尽管警方加大打…

[vue2]深入理解vuex

本节内容 概述初始化仓库定义数据访问数据修改数据处理异步派生数据模块拆分案例-购物车 概述 vuex是一个vue的状态管理工具, 状态就是数据 场景 某个状态在很多个组件使用 (个人信息)多个组件 共同维护 一份数据 (购物车) 优势 数据集中式管理数据响应式变化 初始化仓库 …

Vue36-组件化编程的概念

一、组件化编程VS传统编程 1-1、传统方式的编写应用 存在的问题&#xff1a; 1-2、组件方式的编写应用 注意&#xff1a;是引入&#xff0c;不是复制&#xff01; 体现了封装的概念&#xff01; 二、模块化、组件化

SonarQube安全扫描常见问题

目录 一、SonarQube质量报告 二、SonarQube扫描常见问题和修复方法 三、SonarQube质量配置 最近小编在使用SonarQube工具进行代码扫描&#xff0c;检查代码异味&#xff0c;系统漏洞等&#xff0c;实际过程中也遇到了不少问题&#xff0c;这篇文章主要列举我遇到的常见问题和…