系列文章的导航链接:

张浩驰:《趣味算法》专栏所有文章分类 - 导航​zhuanlan.zhihu.com

下篇文章Part 2导航:

张浩驰:计算机程序设计艺术(TAOCP)精读笔记1 - 算法分析真正应该有的样子 Part 2​zhuanlan.zhihu.com

作者: @张靖昆

编辑: @张浩驰

一、前言

上一部分讲了算法的5个特征,事实上算法还有诸如效率(Performance)、鲁棒性(Robustness)等特征,效率要与有效性区分开,效率是与时空间复杂度相关的,而鲁棒性是指算法应对错误的能力例如运行时错误和错误输入等。Donald对这两个特性并没有过多介绍,只是对Performance做了一些简单的介绍,这里我也不再赘述,因为相对比较好理解,是算法的高阶特性。

在这一部分,Donald讲解了在整套TAOCP的写作中可能用到的数学知识Mathematical Preliminary,在细看了它的目录结构后,我发现这部分似乎就是《具体数学》(Concrete Mathematics)的缩略版,而这本《具体数学》的作者之一也是Donald,哈哈哈....

所以,,我在经过“深思熟虑”之后,决定将TAOCP的学习旅程分出一个分支部分,专门学习Concrete Mathematics,也就是说,之后的TAOCP将是《具体数学》和TAOCP的并行,TAOCP部分主要讲解算法部分,刚开始我读TAOCP也是为了更具体深刻的学习算法,但是没想到第一卷的大部头是具体数学,真难顶。

所以,TAOCP部分专门讲解算法,另开一个系列专门讨论具体数学,大家和我一起学习吧。哈哈哈哈.....

总之,不要在意这些细节,重点还是算法,对不对,我希望可以让大家通过这一系列的阅读,学习到干货,不需要记笔记,我就是要尽力做到让大家翻着手机,就把东西学了!

nice!!!!

二、第1卷 基本算法 - 第1章 基本概念 - Analysis of an Algorithm

这里以一个简单算法的分析,来说明算法分析真正的样子

问:给定

个元素

,

,...

,如何寻找到该数组中最大值的索引j

开始到

答:这简单的要死对吧,就设定一个局部变量记录暂时的最大值,遍历所有数组所有元素即可。ok,按照这个方法,我们可以将算法步骤如下所示,注意算法是从上到下顺序执行,然后根据条件跳转:、

步骤1. [初始化] 令

步骤2. [边界条件]

,则算法终止

步骤3. [比较] 如果

,则转至步骤5

步骤4. [改变

的值] 令

步骤5. [减小

] 让

,并返回步骤2

上述步骤浅显易懂,没毛病。那么你将如何分析算法复杂度?当然这也是P话,踏马的,这么简单,不就是

吗?没错,确实是,你长得最漂亮,最帅,学的最棒,你说得对。但是,卑微的我要告诉众美女帅哥,

复杂性分析绝不止于

这样的上界分析,算法分析还要考虑下界情况,平均情况,并且还要考虑到常系数!!!

可以说,人们确实更多关注算法的上界,为了心里有个数,了解最坏的情况,这可能适用于做决策不需要精细考察的场合,但在算法分析中,仅仅一个

不够的,因为只关注这个可能会让你对一个算法的了解比较片面,例如朴素排序方法中的插入排序,可能我们都知道是
,但

实际上插入排序真正的复杂度是和初始输入序列中的逆序对个数相关的,如果不做更为细致的分析,我们很容易忽视这一点,往往以

的函数一笔带过,非常粗糙!

好了, 我要开始装逼了,我们来看看如何分析这个算法:

不妨先看一下下表,

步骤 执行次数

步骤1

步骤2

步骤3

步骤4

(一个未知量)

步骤5

这里步骤4是一个未知量,因为我不知道序列的分布是怎么样的,因此并不清楚步骤4会被执行多少次,而对该算法的分析就是对A的研究!

so?怎么研究?嗯哼?

没错,就是这样,yes!采用概率研究!当然你也可以只考虑A最好的情况和最坏的情况,比如你所选取的k一开始就是最大元素,之后每次到步骤3都会直接跳至步骤5,或者你开始选取的k是最小元素,使得步骤4始终会被执行。

考虑全排列,即1个序列有多少种排列方法,根据我们的已有知识,一个包含有

个元素的序列全部的可能排列为

,因此进行概率研究时,
个元素构成序列所有可能的样本空间中包含
个元素,也就是求概率时的分母。下面我们列出要研究的概率式子:

***那么,重点来了如何确定

时,序列全排列的个数?

现在我们的研究是黑盒性质的,我们并不清楚原始序列的元素是什么样的即我们不知道原始序列有没有相同的元素或者相同的元素有多少等等,因此我们只能一般意义上来进行概率研究,我们不能考虑元素本身的特征,要从一般意义上研究

举个栗子帮助大家理解“为什么要从一般意义上研究

”。假如我们事先知道了这个序列是从

开始的前
个自然数(
)构成的序列,那么显然
的概率就是
。因为只有当初始值
时,遇到序列中的
这总共10个数才会导致步骤4被执行10次,那么初始值
的初始值序列个数就是
,就是说元素
事先占了下标
的最后一个坑位,那么剩余99个元素随意排列就行了,得到的最终序列都将导致步骤4被执行
次,所以A=10的概率显然就是
为其他值也是这样就得到了,然后很easy的就得到了
的期望。

然而这并不是我们想要的所以这就是为什么我们必须从一般意义上研究A,否则我们的研究就必须考虑原始序列中元素的分布情况,那就多了去了,原始序列可能遵循均匀分布、正态分布、几何分布等等等,也可能不遵循任何分布,你对每种分布都做一次研究,那你的研究就不具有很好地泛化能力,原地爆炸。

如何才能解决这个问题?这个重点我们下一篇继续,大家可以自行思考一下先

感谢大家的阅读,非常感谢!让我们共同成长!

敏感性分析算法 程序_计算机程序设计艺术(TAOCP)精读笔记1 - 算法分析真正应该有的样子 Part 1...相关推荐

  1. 《计算机程序设计艺术》读书笔记(一)

    文章目录 卷一:数学知识准备篇 数学归纳法 数学归纳法与程序设计 初等数论基础 素数筛算法 余数 欧几里得算法 扩展欧几里得 斐波那契数列 快速幂算法 快速乘算法 矩阵快速幂 练习题:HZOJ.317 ...

  2. Marioの《计算机程序设计艺术》读书笔记:数学归纳法

    本期内容:卷一第一章 1.2.1 数学归纳法 本节内容先以一个命题谈起: 令P(n)是关于整数n的某个命题,假定我们需要证明P(n)对于所有正整数n为真,一种重要的做法是:(a)证明P(1)为真    ...

  3. Marioの《计算机程序设计艺术》读书笔记:数、幂与对数

    本期内容:卷一第一章 1.2.2 数.幂与对数 本章开始对数值数学的研究: 整数(integer number):...,-3,-2,-1,0,1,2,3,... 有理数(rational numbe ...

  4. 计算机程序设计艺术(中文版)

    "如果你认为自己是一名真正优秀的程序员--读Knuth的<计算机程序设计艺术>--如果你能全部读懂的话你一定给我发一份简历."                      ...

  5. 82岁高龄的高德纳仍在写《计算机程序设计艺术》,那是他未完成的人生目标...

    本文转载自:程序员书库 编译:猿妹 链接: https://www.quantamagazine.org/computer-scientist-donald-knuth-cant-stop-telli ...

  6. 《禅与计算机程序设计艺术》 / 陈光剑

    第一性原理 宇宙之起源 物质之形成 半导体材料 纳米光刻 二极管 太极阴阳与二进制 布尔代数与数字逻辑系统 模拟电子电路系统 信号与处理 信息论 图灵机模型 冯诺依曼模型 计算机演化史 什么是编程? ...

  7. 什么是艺术?《禅与计算机程序设计艺术》 / 陈光剑

    贡布里希在<艺术的故事>一书中说过:"根本没有艺术这种东西,唯有艺术家而已".意思是,艺术其实就是艺术家的一种表达方式.情绪和价值观.艺术家在哪里,艺术就在哪里:艺术在 ...

  8. 程序 = 数据结构 + 算法《禅与计算机程序设计艺术》 / 陈光剑

    程序 = 数据结构 + 算法 "数据结构和算法是过去 50 年来最重要的发明之一,它们是软件工程师需要了解的基础工具." <Think Data Structures: Al ...

  9. 36 岁捧走图灵碗!80 岁算法大师高德纳要在 105 岁完结《计算机程序设计艺术》...

    编译:CSDN - 弯月(ID:CSDNnews):英文: Siobhan Roberts 号称计算机领域经典必读的著作你都读过哪些,例如<计算机程序设计艺术>系列?近日,这套书的作者高德 ...

最新文章

  1. kvm虚拟机--存储池配置梳理(转)
  2. 基础知识--:before伪元素和:after伪元素
  3. idea创建maven的web项目
  4. 设计模式的理解:桥模式 Bridge
  5. Java常见Jar包的用途
  6. 你确定你会使用git commit?
  7. 【matlab】随意记录
  8. XUtils BitmapUtils 改造以加入drawable支持
  9. 2022-05-25 网络测试软件PingTools
  10. 什么是模拟信号?数字信号?区别是什么?它们又是如何完成转换的?
  11. BZOJ1050 旅行comf
  12. 流量偷跑,运营商该不该赔偿?
  13. 如何区别劳动合同和劳务派遣合同
  14. zz:几天猎头生活的感想
  15. NET性能优化-推荐使用Collections.Pooled(补充)
  16. 行业渠道再洗牌,运营商或重掌行业话语权
  17. SAP UI5 应用开发教程之一百零二 - SAP UI5 应用的打印(Print)功能实现详解试读版
  18. 【中软软件测试笔试题】中国软件与技术服务股份有限公司笔试一卷
  19. Nginx代理https接口
  20. 什么是步进电机的细分? 什么是细分?是不是细分越高精度越高?

热门文章

  1. Mybatis(动态SQL大全)
  2. linux如何运行java程序,Linux环境下运行简单java程序
  3. eplise怎么连接数据库_Eclipse怎么打开数据库?Eclipse连接oracle等数据库的教程
  4. java短信验证码实现_社交APP开发短信验证是通过什么技术实现
  5. 计算机组成原理fpga实验指导书,计算机组成原理 FPGA实验指导书.doc
  6. Java 跑酷游戏 rush,翻转跑酷游戏安卓下载|翻转跑酷最新版(Flip Rush)下载v1.0.5-乐游网安卓下载...
  7. java读取mysql配置文件_MySql主从复制,从原理到实践
  8. 回顾JavsScript对象的克隆
  9. poi下载excel模板
  10. CodeForces 828C String Reconstruction(并查集思想)