《算法分析与设计(第5版)》——王晓东 - 学习记录 / 期末复习
前言
- 《算法分析与设计(第5版)》——王晓东
- 前四章的学习、记录、分享
(锚点⬇)分治法 - 常见算法示例【目录】
(锚点⬇)动态规划 - 常见算法示例【目录】
(锚点⬇)贪心算法 - 常见算法示例【目录】
第 1 章 算法概述
1.1 “程序”与“算法”
- 算法是指解决问题的一种方法或一个过程。
算法是若干指令的有穷序列,满足性质: (1)输入;(2)输出;(3)确定性;(4)有限性。
“好”的算法应达到以下目标:正确性、可读性、健壮性、高效性与低存储要求。 - 程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)。 - 区别:程序是结果,算法是手段(方法);
- 联系:算法+数据结构=应用程序。
1.2 算法复杂性
- 算法的时间复杂性T(n);算法的空间复杂性S(n)(……)
- 算法的计算复杂性概念(……)
- 算法渐近复杂性的数学表述及复杂度的计算(……)
第 2 章 递归与分治策略
2.1 “递归”与“分治”
- 直接或间接地调用自身的算法称为递归算法。
- 用函数自身给出定义的函数称为递归函数。递归函数的二要素:边界条件、递归方程。
- 分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
- 分治与递归的关系:递归结构是循环结构的一种,也是分治思想应用最多的一种程序结构;但是不一定要使用它,关键在于是否能够写出递归公式以及是否有必要使用递归算法。
2.2 分治法的使用
应用分治法的前提:
- 原问题与分解成的小问题相同或相似;
- 原问题分解成的子问题可以独立求解,子问题之间没有相关性;
- 当子问题足够小时,可以直接求解(或者说,具有分解终止条件);
- 可以将子问题合并成原问题,且合并操作的复杂度不高。
分治法的基本思想:
- 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。
- 对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。
- 如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。
分治法所能解决的问题的一般特征:
- 该问题的规模缩小到一定的程度就可以容易地解决;
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。
分治法的基本步骤(形式化)
divide-and-conquer(P)—分而治之 {if ( | P | <= n0) adhoc(P); //解决小规模的问题divide P into smaller subinstances P1,P2,...,Pk; //分解问题for (i=1,i<=k,i++)yi=divide-and-conquer(Pi); //递归的解各子问题return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
2.3 递归与分治策略的应用示例
- 已更新 【递归】n的阶乘
- 已更新 【递归 & 动态规划】Fibonacci数列(斐波那契数列)
- 已更新 【递归】Ackerman函数(阿克曼函数)
- 已更新 【递归】全排列
- 已更新 【递归】整数划分
- 已更新 【分治】大整数乘法
- 已更新 【分治】合并排序
- 已更新 【分治】快速排序
- 已更新 【分治】二分查找
- Hanoi塔(待定)
- Strassen矩阵乘法(待定)
- 已更新 【分治】棋盘覆盖(待定)
- 已更新 【分治】线性时间选择(待定)
- 最接近点对问题(待定)
- 已更新 【分治】循环赛日程表
第 3 章 动态规划
3.0 理解多阶段决策问题……
3.1 动态规划算法
- 基本要素:
- 最优子结构性质:问题的最优解包含了子问题的最优解
- 重叠子问题性质:保存子问题的解,再次需要时进行查询
- 基本步骤:
- 找出最优解的性质,并刻划其结构特征。
- 递归地定义最优值(写出动态规划方程)。
- 以自底向上的方式计算出最优值。
- 根据计算最优值时得到的信息,构造最优解。
3.2 分治算法与动态规划算法的差异
- 与分治法类似的是:将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
- 与分治法不同的是:经分解的子问题往往不是相互独立的。
- 若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。
- 若用动态规划来解,保存已解决的子问题的答案,在需要时再查找,避免重复计算。
3.3 备忘录方法的概念
- 用一个表格来保存已解决的子问题的答案,用的时候查表即可;
- 采用的递归方式是自顶向下,动态规划是自低向上;
- 控制结构与直接递归相同,区别在于备忘录方式为每个解过的子问题建立备忘录;
- 初始化为每个子问题的记录存入一个特殊的值,表示并未求解;在求解过程中,查看相应记录如果是特殊值,表示未求解,否则只要取出该子问题的解即可。
3.4 动态规划算法的应用示例
- 已更新 【递归 & 动态规划】Fibonacci数列(斐波那契数列)
- 已更新 【动态规划】矩阵连乘
- 最长公共子序列(待定)
- 最大子段和(待定)
- 已更新 【动态规划】0-1背包问题
- 已更新 【动态规划】最优二叉搜索树
第 4 章 贪心算法
4.1 贪心算法
- 概念:
- 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
- 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
- 基本要素:
- 最优子结构性质:问题的最优解包含其子问题的最优解
- 贪心选择性质:整体的最优解可通过一系列局部最优解达到;每次的选择可以依赖以前作出的选择,但不能依赖于后面的选择。
4.2 贪心算法与动态规划算法的差异
- 相同点:都要求问题具有最优子结构性质。
- 不同点:
- 贪心算法自顶向下进行分解,每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不保留最终得到某种意义上的局部最优解;
- 动态规划自底向上进行分解,记录所有局部最优解……(……)
4.3 贪心算法的应用示例
- 已更新 【贪心算法】活动安排问题
- 已更新 【贪心算法】一般背包问题
- 哈夫曼编码(待更新)
- 已更新 【贪心算法】单源最短路径
- 已更新 【贪心算法】最小生成树
《算法分析与设计(第5版)》——王晓东 - 学习记录 / 期末复习相关推荐
- 他的体育课在下午五点结束使用计算机,外研版七年级上册英语期末复习知识点整理(1-5Module)...
外研版七年级上册英语期末复习知识点整理(上) Module 1 重点短语 1.be from... =come from...来自...... 2....years old ...
- 算法设计与分析(Algorithm Design )课后习题作业+期末复习+期末习题
课后习题作业资源链接 期末复习+期末习题资源链接 对应的书(不是算法导论):算法设计与分析(Algorithm Design ) Jon KIeinberg 著 张立昂 屈婉玲 译 有这本书中英文版. ...
- 王晓东算法设计与分析c语言,Algorithm 计算机算法设计与分析(王晓东版)课程设计经典例子 - 下载 - 搜珍网...
程序/ 程序/lab 3-11/ 程序/lab 3-11/3-11 正则表达式匹配问题.cpp 程序/lab 4-11/ 程序/lab 4-11/4-11 删数问题.cpp 程序/lab 4-3/ 程 ...
- C++高级编程(第3版)_学习记录
<C++高级编程(第3版)> Professional C++, Third Edition [美]Narc Gregoire 著,张永强 译,清华大学出版社,2015.5第1版 文章目录 ...
- 【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案
所有章节归类好了概念.算法,同时课后的简答题也一并给出了答案.祝各位复习愉快~ 整理不易希望能点个赞~ 目录 第一章 操作系统概述 第二章 进程的描述与控制 第三章 处理机调度与死锁 第四章 进程同步 ...
- Java面向对象编程(第2版)_学习记录
<Java面向对象编程(第2版)> 孙卫琴 编著 文章目录 一.介绍 (一)平台与开发环境 (二)一些知识 (三)数组 二.类的生命周期 (一)类的加载 1. 加载 2. 连接 3. 初始 ...
- 网格员计算机应用基础知识,计算机应用基础(第3版)周南岳(win7office10)期末复习及答案.doc...
计算机基础(3)试样卷一 一.单项选择题(每小题 1 分,共60 分 ) 1. 在计算机内部,一切信息的存取.处理和传送都是以( )形式进行的. A )EBCDIC码 B )ASCII码 C )十六进 ...
- 计算机网络(第七版) 谢希仁 期末复习
思维导图总结 第一章 概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 运输层 第六章 应用层 第九章 无线网络和移动网络
- 《算法分析与设计》学习心得
在学习了<算法分析与设计>这门课后,我对常见的算法有了一个基本的了解.本书主要从算法概述.递归与分治策略.动态规划.贪心算法.回溯法.分支限界法.随机化算法.线性规划与网络流.NP完全性理 ...
- 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东
算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...
最新文章
- 主板电源开关接口图解_电脑主板开机电路检修步骤及思路。
- python3安装哪个版本-python2和python3哪个版本新
- python下处理win和linux分行符
- javascript Function()
- 隐秘的角落里数亿场AI战争正在发生
- XBRL 可扩展商业报告语言
- 【Django 2021年最新版教程26】模板语言 前端if判断怎么用 实例
- 怪事:两台linux的samba共享目录,一个能访问一个不能访问
- sqlserver高可用方案_PowerJob 的自实现高可用方案,妙妙妙
- macos设置环境变量path详解
- 另外一套中英文颜色代码
- 前端面试谈:项目经历的 STAR 法则
- iPhone启动页尺寸
- 谈谈亲历的WMS、MES与ERP的集成之路
- Data truncation: Data too long for column ‘xxx‘
- python操作xslx/xsl出现‘\xa0‘和读取时间变成float类型的处理办法
- 【题目泛做】哲学题(DFS序)(Splay)
- 数据库连接数和数据库连接池的连接数区别?
- Qt编写安防视频监控系统2-视频播放
- 前端自适应缩放解决方案