前言

  • 《算法分析与设计(第5版)》——王晓东
  • 前四章的学习、记录、分享
    (锚点⬇)分治法 - 常见算法示例【目录】
    (锚点⬇)动态规划 - 常见算法示例【目录】
    (锚点⬇)贪心算法 - 常见算法示例【目录】

第 1 章 算法概述

1.1 “程序”与“算法”

  1. 算法是指解决问题的一种方法或一个过程。
    算法是若干指令的有穷序列,满足性质: (1)输入(2)输出(3)确定性(4)有限性
    “好”的算法应达到以下目标:正确性、可读性、健壮性、高效性与低存储要求。
  2. 程序是算法用某种程序设计语言的具体实现。
    程序可以不满足算法的性质(4)
  3. 区别:程序是结果,算法是手段(方法);
  4. 联系:算法+数据结构=应用程序。

1.2 算法复杂性

  1. 算法的时间复杂性T(n);算法的空间复杂性S(n)(……)
  2. 算法的计算复杂性概念(……)
  3. 算法渐近复杂性的数学表述及复杂度的计算(……)

第 2 章 递归与分治策略

2.1 “递归”与“分治”

  1. 直接或间接地调用自身的算法称为递归算法
  2. 用函数自身给出定义的函数称为递归函数。递归函数的二要素:边界条件、递归方程。
  3. 分治法:就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
  4. 分治与递归的关系:递归结构是循环结构的一种,也是分治思想应用最多的一种程序结构;但是不一定要使用它,关键在于是否能够写出递归公式以及是否有必要使用递归算法。

2.2 分治法的使用

  1. 应用分治法的前提

    1. 原问题与分解成的小问题相同或相似;
    2. 原问题分解成的子问题可以独立求解,子问题之间没有相关性;
    3. 当子问题足够小时,可以直接求解(或者说,具有分解终止条件);
    4. 可以将子问题合并成原问题,且合并操作的复杂度不高。
  2. 分治法的基本思想

    1. 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。
    2. 对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。
    3. 如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。
  3. 分治法所能解决的问题的一般特征

    1. 该问题的规模缩小到一定的程度就可以容易地解决;
    2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
    3. 利用该问题分解出的子问题的解可以合并为该问题的解;
    4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
      这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。
  4. 分治法的基本步骤(形式化)

    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 递归与分治策略的应用示例

  1. 已更新 【递归】n的阶乘
  2. 已更新 【递归 & 动态规划】Fibonacci数列(斐波那契数列)
  3. 已更新 【递归】Ackerman函数(阿克曼函数)
  4. 已更新 【递归】全排列
  5. 已更新 【递归】整数划分
  6. 已更新 【分治】大整数乘法
  7. 已更新 【分治】合并排序
  8. 已更新 【分治】快速排序
  9. 已更新 【分治】二分查找
  10. Hanoi塔(待定)
  11. Strassen矩阵乘法(待定)
  12. 已更新 【分治】棋盘覆盖(待定)
  13. 已更新 【分治】线性时间选择(待定)
  14. 最接近点对问题(待定)
  15. 已更新 【分治】循环赛日程表

第 3 章 动态规划

3.0 理解多阶段决策问题……

3.1 动态规划算法

  1. 基本要素:

    1. 最优子结构性质:问题的最优解包含了子问题的最优解
    2. 重叠子问题性质:保存子问题的解,再次需要时进行查询
  2. 基本步骤:
    1. 找出最优解的性质,并刻划其结构特征
    2. 递归地定义最优值(写出动态规划方程)。
    3. 自底向上的方式计算出最优值。
    4. 根据计算最优值时得到的信息,构造最优解

3.2 分治算法与动态规划算法的差异

  1. 与分治法类似的是:将原问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
  2. 与分治法不同的是:经分解的子问题往往不是相互独立的。
    1. 若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。
    2. 若用动态规划来解,保存已解决的子问题的答案,在需要时再查找,避免重复计算。

3.3 备忘录方法的概念

  1. 用一个表格来保存已解决的子问题的答案,用的时候查表即可;
  2. 采用的递归方式是自顶向下,动态规划是自低向上;
  3. 控制结构与直接递归相同,区别在于备忘录方式为每个解过的子问题建立备忘录
  4. 初始化为每个子问题的记录存入一个特殊的值,表示并未求解;在求解过程中,查看相应记录如果是特殊值,表示未求解,否则只要取出该子问题的解即可。

3.4 动态规划算法的应用示例

  1. 已更新 【递归 & 动态规划】Fibonacci数列(斐波那契数列)
  2. 已更新 【动态规划】矩阵连乘
  3. 最长公共子序列(待定)
  4. 最大子段和(待定)
  5. 已更新 【动态规划】0-1背包问题
  6. 已更新 【动态规划】最优二叉搜索树

第 4 章 贪心算法

4.1 贪心算法

  1. 概念:

    1. 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
    2. 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
  2. 基本要素:
    1. 最优子结构性质:问题的最优解包含其子问题的最优解
    2. 贪心选择性质:整体的最优解可通过一系列局部最优解达到;每次的选择可以依赖以前作出的选择,但不能依赖于后面的选择。

4.2 贪心算法与动态规划算法的差异

  1. 相同点:都要求问题具有最优子结构性质。
  2. 不同点
    1. 贪心算法自顶向下进行分解,每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不保留最终得到某种意义上的局部最优解;
    2. 动态规划自底向上进行分解,记录所有局部最优解……(……)

4.3 贪心算法的应用示例

  1. 已更新 【贪心算法】活动安排问题
  2. 已更新 【贪心算法】一般背包问题
  3. 哈夫曼编码(待更新)
  4. 已更新 【贪心算法】单源最短路径
  5. 已更新 【贪心算法】最小生成树

《算法分析与设计(第5版)》——王晓东 - 学习记录 / 期末复习相关推荐

  1. 他的体育课在下午五点结束使用计算机,外研版七年级上册英语期末复习知识点整理(1-5Module)...

    外研版七年级上册英语期末复习知识点整理(上) Module 1 重点短语 1.be from... =come from...来自...... 2....years old               ...

  2. 算法设计与分析(Algorithm Design )课后习题作业+期末复习+期末习题

    课后习题作业资源链接 期末复习+期末习题资源链接 对应的书(不是算法导论):算法设计与分析(Algorithm Design ) Jon KIeinberg 著 张立昂 屈婉玲 译 有这本书中英文版. ...

  3. 王晓东算法设计与分析c语言,Algorithm 计算机算法设计与分析(王晓东版)课程设计经典例子 - 下载 - 搜珍网...

    程序/ 程序/lab 3-11/ 程序/lab 3-11/3-11 正则表达式匹配问题.cpp 程序/lab 4-11/ 程序/lab 4-11/4-11 删数问题.cpp 程序/lab 4-3/ 程 ...

  4. C++高级编程(第3版)_学习记录

    <C++高级编程(第3版)> Professional C++, Third Edition [美]Narc Gregoire 著,张永强 译,清华大学出版社,2015.5第1版 文章目录 ...

  5. 【《操作系统慕课版》合集】期末复习 + 核心算法整理 + 课后答案

    所有章节归类好了概念.算法,同时课后的简答题也一并给出了答案.祝各位复习愉快~ 整理不易希望能点个赞~ 目录 第一章 操作系统概述 第二章 进程的描述与控制 第三章 处理机调度与死锁 第四章 进程同步 ...

  6. Java面向对象编程(第2版)_学习记录

    <Java面向对象编程(第2版)> 孙卫琴 编著 文章目录 一.介绍 (一)平台与开发环境 (二)一些知识 (三)数组 二.类的生命周期 (一)类的加载 1. 加载 2. 连接 3. 初始 ...

  7. 网格员计算机应用基础知识,计算机应用基础(第3版)周南岳(win7office10)期末复习及答案.doc...

    计算机基础(3)试样卷一 一.单项选择题(每小题 1 分,共60 分 ) 1. 在计算机内部,一切信息的存取.处理和传送都是以( )形式进行的. A )EBCDIC码 B )ASCII码 C )十六进 ...

  8. 计算机网络(第七版) 谢希仁 期末复习

    思维导图总结 第一章 概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 运输层 第六章 应用层 第九章 无线网络和移动网络

  9. 《算法分析与设计》学习心得

    在学习了<算法分析与设计>这门课后,我对常见的算法有了一个基本的了解.本书主要从算法概述.递归与分治策略.动态规划.贪心算法.回溯法.分支限界法.随机化算法.线性规划与网络流.NP完全性理 ...

  10. 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东

    算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...

最新文章

  1. 主板电源开关接口图解_电脑主板开机电路检修步骤及思路。
  2. python3安装哪个版本-python2和python3哪个版本新
  3. python下处理win和linux分行符
  4. javascript Function()
  5. 隐秘的角落里数亿场AI战争正在发生
  6. XBRL 可扩展商业报告语言
  7. 【Django 2021年最新版教程26】模板语言 前端if判断怎么用 实例
  8. 怪事:两台linux的samba共享目录,一个能访问一个不能访问
  9. sqlserver高可用方案_PowerJob 的自实现高可用方案,妙妙妙
  10. macos设置环境变量path详解
  11. 另外一套中英文颜色代码
  12. 前端面试谈:项目经历的 STAR 法则
  13. iPhone启动页尺寸
  14. 谈谈亲历的WMS、MES与ERP的集成之路
  15. Data truncation: Data too long for column ‘xxx‘
  16. python操作xslx/xsl出现‘\xa0‘和读取时间变成float类型的处理办法
  17. 【题目泛做】哲学题(DFS序)(Splay)
  18. 数据库连接数和数据库连接池的连接数区别?
  19. Qt编写安防视频监控系统2-视频播放
  20. 前端自适应缩放解决方案

热门文章

  1. 解决Office2010每次打开都要配置进度的问题
  2. MacOS 64位GaussView5的破解
  3. AR人体姿态识别,实现无边界的人机交互
  4. 临时邮件、临时接收手机验证码等好用工具
  5. 三角网导线平差实例_导线三角网平差计算中的Wd是什么意思啊?怎么的算出来的?...
  6. 图像几何运算——Matlab实现
  7. 计算幻术之路(一):被定义之前的增强现实
  8. 杆刚度校核c语言程序,c语言 求解单元刚度矩阵
  9. Java游戏编程技术-1
  10. 绿坝老板不诚实,蒙骗政府官员