西电-算法分析-研究生课程复习笔记

  • 24年秋的应该是张老师最后一次用卷面考试,他说以后这节课的期末考试都是在OJ上刷题了
  • 张老师上课还挺有意思的,上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念,考试也是考个人对这些的理解,还挺好玩的哈哈

时间复杂度

T ( n ) T(n) T(n) 表示算法在输入规模为 n n n 时的实际运行时间

在实际算法设计中常用以下三种:

  • O O O 即“小于等于”,描述 T ( n ) T(n) T(n)的上界。
    1 、 n 、 2 n 、 2 n 2 ∈ O ( n 2 ) 1、n、2n、2n^2 \in O(n^2) 1n2n2n2O(n2)
  • Ω Ω Ω 即“大于等于”,描述 T ( n ) T(n) T(n)的下界。
    n 2 、 n 3 、 n 10 ∈ Ω ( n 2 ) n^2、n^3、n^{10} \in Ω(n^2) n2n3n10Ω(n2)
  • Θ Θ Θ 表示“等于”,表示 T ( n ) T(n) T(n)的上下界一致。
    n 2 , 3 n 2 ∈ Θ ( n 2 ) n^2,3n^2 \in Θ(n^2) n2,3n2Θ(n2)

在这里插入图片描述

主定理求递推式的时间复杂度
T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)

其中 a a a 为归约后的子问题个数, n / b n/b n/b 为归约后子问题的规模, f ( n ) f(n) f(n)为 split 和 merge 子问题的解的工作量。

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

直接上例题:

  1. T ( n ) = 9 T ( n 3 ) + n T(n)=9T(\frac{n}{3})+n T(n)=9T(3n)+n
    a = 9 , b = 3 , f ( n ) = n , n l o g b a = n 2 a=9,b=3,f(n)=n,n^{log_ba}=n^2 a=9b=3f(n)=nnlogba=n2
    因为 f ( n ) = n < n 2 f(n) = n < n^2 f(n)=n<n2,即case 1, T ( n ) = Θ ( n 2 ) T(n)=Θ(n^2) T(n)=Θ(n2)

  2. T ( n ) = T ( 2 n 3 ) + 1 T(n)=T(\frac{2n}{3})+1 T(n)=T(32n)+1
    a = 1 , b = 2 3 , f ( n ) = 1 , n l o g b a = 1 a=1,b=\frac{2}{3}, f(n)=1, n^{log_ba}=1 a=1b=32,f(n)=1,nlogba=1
    因为 f ( n ) = = n l o g b a f(n) == n^{log_ba} f(n)==nlogba,即case 2,此时k为0,即 T ( n ) = Θ ( l o g n ) T(n)=Θ(logn) T(n)=Θ(logn)

  3. T ( n ) = 2 T ( n 4 ) + n 2 T(n)=2T(\frac{n}{4})+n^2 T(n)=2T(4n)+n2
    a = 2 , b = 4 , f ( n ) = n 2 , n l o g b a = n 0.5 a=2,b=4,f(n)=n^2, n^{log_ba}=n^{0.5} a=2b=4f(n)=n2,nlogba=n0.5
    因为 f ( n ) > n l o g b a f(n)>nlog_ba f(n)>nlogba,所以是第三种, T ( n ) = Θ ( n 2 ) T(n)=Θ(n^2) T(n)=Θ(n2)

排序

分-治-合并。

老师说的砍规模好像就包括了分和治。

砍规模干活多,则合并时候干活少。反之同理。
二分应用于排序:对于quicksort和mergesort,快排在砍规模时先要让两边各自大于或小于pivot,较麻烦;而合并不需要显式操作,较简单。归并排序在砍规模时直接将数组分成两半,较简单;合并时要进行两个数组的排序和合并,较麻烦。

规模 n 推到规模 n-1应用于排序:选择排序、冒泡排序、插入排序,每次只减少一个问题数量,是较慢的。而这三个排序中,选择排序和冒泡排序每次少一个未排序部分的最值元素,即砍规模时多干活。而插入排序每次少一个当前游标的元素(不一定是最值),而需要在合并时将游标元素在已排序部分插到合适的位置,即合并时多干活。

快排可能会退化,采用随机策略可以避免最坏复杂度为 O ( n 2 ) O(n^2) O(n2)

特殊线性排序不考。

建堆

按照树的形态去砍规模。

砍规模干活多:比如大顶堆,先选一个最大的放在堆顶,然后递归地处理两个子树。相当于规模直接砍半,无显式合并。
T ( n ) = 2 T ( n 2 ) + O ( n ) T(n)=2T(\frac{n}{2})+O(n) T(n)=2T(2n)+O(n),得 T ( n ) = Θ ( n l o g n ) T(n)=Θ(nlogn) T(n)=Θ(nlogn)

砍规模干活少:从最后一个节点开始一下一下砍,直接找最后一个没用的非叶节点即可。合并是将当前子树的根节点向下调整,耗时较长。 T ( n ) = 2 T ( n 2 ) + l o g n T(n)=2T(\frac{n}{2})+logn T(n)=2T(2n)+logn,得 T ( n ) = Θ ( n ) T(n)=Θ(n) T(n)=Θ(n)

Insert:把元素插入到最后一项,再向上调整。(堆排序同理)

如果要动态挑最值,可以用优先队列辅助。

Select

找数组中第k小的元素。

类似快排的partition,数组二分后看topk在哪边。

有种优化策略,将数组先分为多组(每组中奇数个元素),再在每组找个中位数,使用中位数的中位数作为pivot做partition。避免 O ( n 2 ) O(n^2) O(n2)的最坏时间复杂度。

矩阵相乘的二分方法

不考

最大子数组

找和最大的非空连续子数组。

方法1:二分,将数组分为两半,从左半部分、右半部分和跨中间这三部分的子数组中找个最大的。跨中间就是从中点往前面找个最大的后缀、往后边找个最大的前缀,相加就是跨中间的最大子数组。

方法2:DP,每次减少一个问题的规模。用一个全局变量保存历史最大子数组,并保存当前位置之前的子数组情况。如果之前的子数组之和已经为负数,则从当前位置另起一个新子数组。否则扩展之前的子数组到当前为止,即使当前元素为负数,全局变量保存的仍是之前的全局最大子数组。

DP

优化问题用到规模压缩,即DP。

  • 刻画最优子结构。列递推式/状态转移方程,能用中文解释。
  • 递归定义最优解的值。
  • 自下而上计算。原因:需要利用子问题,而多个父问题共享某些子问题,即子问题会被重复的求解。自下而上可以避免重复求解。如果改成自上而下,则需要使用备忘录做记忆化。

有些问题不能用子问题求最优解,比如最长简单路径问题,可能两个最长简单子路径拼起来不是简单路径。

相关问题(计算题):

1. 01背包

思路:穷举是每个物品要么放入要么不放入, O ( 2 n ) O(2^n) O(2n)。如果当前剩余容量为 k,在考虑第 i 个物品是否拿,拿不拿的两种情况,都可以利用 d p [ i − 1 ] [ k ] dp[i-1][k] dp[i1][k]这个子问题。由于不知道 k 是多少,每次都需要扫描一遍整个容量。

2. 最大子数组

上面写了。

3. LCS最长公共子序列

思路:穷举是 O ( 2 m + n ) O(2^{m+n}) O(2m+n)。如果已知当前游标 i i i j j j 前面的LCS,继而可以得到当前的LCS。即满足最优子结构。 d p dp dp数组起到备忘录的作用。

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示序列 X X X 的前 i i i个字符和序列 Y Y Y 的前 j j j 个字符的 LCS 长度。

m, n = len(X), len(Y)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
    for j in range(1, n + 1):
        if X[i - 1] == Y[j - 1]:
            dp[i][j] = dp[i - 1][j - 1] + 1
        else:
            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

4. 矩阵链乘

对于矩阵数组 [ A 1 , A 2 , A 3 ] [A1,A2,A3] [A1,A2,A3]的链乘最小代价,可以通过 [ A 1 , A 2 ] ∗ [ A 3 ] [A1,A2]*[A3] [A1,A2][A3] [ A 1 ] ∗ [ A 2 , A 3 ] [A1]*[A2,A3] [A1][A2,A3]的代价得到,利用了 [ A 1 , A 2 ] [A1,A2] [A1,A2] [ A 2 , A 3 ] [A2,A3] [A2,A3]这两个子问题。扩展即可知道子问题就是在各个分割点分割之后的子数组,利用子问题的方式就是从子问题中选一个最值。满足最优子结构。

会重复利用较短的子数组,所以自下而上,用个dp数组做备忘录。

5. ALS装配线调度

就是给了两条装配线的进入耗时、出去耗时。然后两条装配线在功能上是相同的,有多个装配站,两条线上同一个下标的装配站是功能相同,但用时可能不同。所以有个切换操作,可以把物品从一条线搬到另一条线,试图加速。所以要求一个物品完成装配花费的最短时间。长的像最短路径,其实因为方向是固定的,所以不是图而是树,问题稍微简单一点。

在这里插入图片描述

dp方法见下图。
在这里插入图片描述

贪心

如果可以直接知道用哪个子问题也能得到最优解,不用比较各个子问题的结果,就可以贪心、即贪心 ∈ \in DP。
相关问题如:

  • 分数背包:优先选单价高的。

  • 哈夫曼树:权重越高的字符,编码长度越短。权重越高,越会被后挑选,即越接近根节点。
    在这里插入图片描述

  • 活动选择:多个活动有起止时间,只能选互不冲突的,使活动数量最大化。DP是在当前活动处,找前面最后一个兼容本活动的活动,然后选或者不选,dp[i]是到前i个活动的最多兼容活动数。贪心策略是优先选结束时间早的,为后续活动留下更多时间。

最短路径

重点是确定通过计算次序。

之前的问题都是可以转化为一棵树,子问题向上扩展,最终得解。

而b->c、c->b都有可能,即c可以利用b之前的最短路径、b也可以利用c之前的最短路径。所以不能是一棵向上的树。所以需要确定一个计算次序,即谁是子问题。

Dijkstra

在无负权环的时候,这个计算次序是有的。他是子问题找父问题,即找一个最近的节点。如果有负权环,则有些很远节点的距离反而越来越近,计算次序就出现问题了。通过计算次序理解为什么是dp。

Bellman-ford

允许负权环,所以没有计算次序,所以迭代多轮来补偿。单源。个人感觉就是Floyd的单源形式。

SPFA就是如果有些点被更新后,才加入队列进行后续的松弛更新。

如果第V次还能松弛,说明有负权环。

Floyd

多源。 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k],已知未使用 k 时,i 到 j 的最短路径,看用 k 是否能继续缩短。

时间复杂度

floyd是 O ( V 3 ) O(V^3) O(V3)

迪杰斯特拉是每次找一个最近的点,然后基于这个中转点更新源点到中转点的邻点。所以对于邻接矩阵的实现,是V的循环里套个找邻点的V, O ( V 2 ) O(V^2) O(V2)
Bellman-ford是重复V-1次,然后松弛所有边,所以是 O ( V ∗ E ) O(V*E) O(VE)

搜索

无法用规模压缩,只能蛮力穷举。

设定边界减少不必要的搜索。

限界函数:杀死更多的节点、效率。

NP问题

P可以在多项式时间内求解,NP只能在多项式问题内验证解。

在这里插入图片描述

NPC(理论上可解,穷举):circuit-sat(电路可满足)、TSP(旅行商)、3-color三色(平面图染三色,使得相邻区域颜色不同)、哈密尔顿路径。

不可判定:Hilbert’s Tenth Problem(希尔伯特第十问题)、Halting Problen(停机问题)、Post Correspondence Problem(PCP)、Program Equivalence Problem(程序等价性问题)、Optimal Data Compression Problem(最优数据压缩问题)、Virus Identification Problem(病毒识别问题)、多元多项式整数根(费马大定理)、普斯特对应问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…

上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天探底回升&#xff0c;沪指盘中跌超1.6%&#xff0c;创业板指一度跌逾3%&#xff0c;午后集体拉升翻红…

基于深度学习算法的AI图像视觉检测

基于人工智能和深度学习方法的现代计算机视觉技术在过去10年里取得了显著进展。如今&#xff0c;它被广泛用于图像分类、人脸识别、图像中物体的识别等。那么什么是深度学习&#xff1f;深度学习是如何应用在视觉检测上的呢&#xff1f; 什么是深度学习&#xff1f; 深度学习是…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…

深度学习每周学习总结R3(LSTM-火灾温度预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R4中的内容&#xff0c;为了便于自己整理总结起名为R3&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据导入3. 数据…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

conda install包时出现CondaHTTPError: HTTP 403 FORBIDDEN for url ....问题,但已经排除镜像源问题

最近连WIFI下包出现如下问题&#xff0c;已排除镜像源问题。但是一直装不上包。 CondaHTTPError: HTTP 403 FORBIDDEN for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/ca-certifica Elapsed: 00:00.202308 An HTTP error occurred when trying to …

【Rust自学】11.3. 自定义错误信息

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.3.1. 添加错误信息 在 11.2. 断言(Assert) 中我们学习了assert!、assert_eq!和assert_ne!这三个宏&#xff0c;而这篇文章讲的就是它…

linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决

前言 今天在使用linux的时候&#xff0c;使用上下键想翻出历史命令时&#xff0c;却出现[[A[[A[[A[[B^[[B这种东东&#xff0c;而tab键补全命令的功能也无法使用。最终发现是由于当前用户使用的shell是/bin/sh的原因。 解决方法 运行以下命令&#xff0c;将默认 shell 设置为…

【操作系统】课程 8文件管理 同步测练 章节测验

8.1知识点导图 它详细地展示了文件的定义、分类、逻辑结构、目录结构以及文件共享和保护的各个方面。下面是对图中内容的文字整理&#xff1a; 文件定义 文件是具有文件名的一组相关信息的集合。 文件分类 按用途分类&#xff1a;系统文件、用户文件、库文件。按存取控制属性分…

1月9日星期四今日早报简报微语报早读

1月9日星期四&#xff0c;农历腊月初十&#xff0c;早报#微语早读。 1、上海排查47家“俄罗斯商品馆”&#xff1a;个别店铺被责令停业&#xff0c;立案调查&#xff1b; 2、西藏定日县已转移受灾群众4.65万人&#xff0c;检测到余震646次&#xff1b; 3、国家发改委&#x…

1.8-9号Python猛刷动态规划

今日宽恕:总结不是纠结过去&#xff0c;表达不是“见斑知豹”&#xff0c;还要更多信息整合后去回答。 题目一 3297.统计重新排列后包含另一个字符串| 示例 1&#xff1a; 输入&#xff1a;word1 "abcabc", word2 "abc" 输出&#xff1a;10 解释&#…

【Python】论文长截图、页面分割、水印去除、整合PDF

有的学校的论文只能在线预览&#xff0c;且存在水印。为保存到本地方便查阅&#xff0c;可以使用以下工作流进行处理&#xff1a; 用浏览器打开在线论文预览界面&#xff1b;使用fastone capture软件截长图&#xff1b;将论文按页数进行分割&#xff1b;按照阈值消除浅色的背景…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例&#xff0c;其基本结构由下图所示。它是主要由两大部分组成&#xff1a;可编程输入/输出&#xff08;Programmable I/Os&#xff09;部分和内部可配置&#xff08;Configurable Logic&#xff09;部分。 可编程输入/输出&#xff08;I/Os…

详解Sonar与Jenkins 的集成使用!

本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner&#xff0c;最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…

010:传统计算机视觉之大津算法初探

本文为合集收录&#xff0c;欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节学习了利用 Canny 算法来完成一个图片的边缘检测&#xff0c;从而可以区分出图像的边缘。 本节再了解一个计算机视觉中更常见的应用&#xff0c;那就是把图片的前景和…

Harmony开发-ArkUI框架速成十一Swiper布局

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.Swiper 1.1 Swiper组件 Swiper组件提供滑动轮播显示的能力。 Swiper本身是一个容…

怎么抓取ios 移动app的https请求?

怎么抓取IOS应用程序里面的https&#xff1f; 这个涉及到2个问题 1.电脑怎么抓到IOS手机流量&#xff1f; 2.HTTPS怎么解密&#xff1f; 部分app可以使用代理抓包的方式&#xff0c;但是正式点的app用代理抓包是抓不到的&#xff0c;例如pin检测&#xff0c;证书双向校验等…

hisi mipi yuv422数据异常问题记录解决

问题解决&#xff0c;海思原厂提供支持后解决方式&#xff0c;适用于dv500和928系列&#xff1a; YUV422输入时&#xff0c;mask[1]使用0x00FFC000得配置。 问题现象就是mask[1]配置的0xFF0000时&#xff0c;YUV值收到后UV的会向下做一个4对齐的操作&#xff0c;导致色度UV数据…

【Cocos TypeScript 零基础 6.1】

目录 敌机敌机通用逻辑制作动画制作另外的敌机制作自动生成敌机整理自己实验写的 敌机 创建一个空节点 (绑定敌机逻辑,敌机相关都可以存在此节点下,编程更有逻辑,便于后续维护)制作 prefab制作销毁动画制作第二个敌机敌机0自动生成 敌机通用逻辑 老是创建了2个空节点? 父节…