# 算法中的数学
初衷是整理出在编程中经常用到的数学知识,并没有找到相关的一本书,《程序员的数学》内容太简单,《数学之美》内容不错,只是侧重于大的算法和领域。算法导论是在读的一本书,里面还是涉及到一高等数学知识的,就从这本书开始整理。
diff --git a/404.html b/404.html new file mode 100644 index 0000000..509d0d5 --- /dev/null +++ b/404.html @@ -0,0 +1,19 @@ + + +
+ + +在对算法分析的过程中,我们会发现部分算法的运行时间依赖于输入数据,比如插入排序,在最好的情况下运行时间是
对于古典概率来说,我们需要经常用到排列组合知识计算样本空间数量,所以需要先回忆一下这部分内容。 +从 n 个不同元素中,任意取出 m 个进行排序,总的排列数目为
从 n 个不同元素中取出 m 个元素构成一个集合的话,则集合的数目为
思考:n 个人坐在圆形会议桌的方法有多少种?
当对 n 个不同的数进行排序时,待处理的数据就是 n 个数的排列,可能的情况有
+插入排序的运行时间与逆序对数目有关,逆序对的数目期望是为 n(n-1)/4 可以这样理解,总共有 n(n - 1)/2 对,每一对是逆序对的概率是 1/2。
快排最坏情况下划分子问题时刚好每次划分 n - 1 个元素和 0 个元素。用递归式表示就是
这时运行时间复杂度为
最好情况下的划分两个子问题规模分别是
根据主定理,
假设每次划分总是 9 : 1 这种情况下,我们有递归式
比较容易证明这种情况下算法的运行时间依然是
事实上,80% 以上的划分都比 9 : 1 更平衡。这个比较容易证明,对于更一般的情况,对于任何常数
快速排序还有一种改进的划分:三数取中。假设我们定义一个好的划分介于 [n/3, 2n/3] 之间,我们想比较一下,改进的算法获得好划分的概率增加了多少。对于平凡实现,获得好划分的概率是 1/3。下面我们来计算下改进的划分是好划分的概率。
+我们假定 A 是数组,
好划分的概率为
当 n 趋于无穷大时,概率为
概率论在人工智能中经常会用到,所涉及的内容也更深入一些。算法分析中涉及到的概率论部分比较简单,大多数的分析用高中所学的概率知识已经可以对付了。这一篇还会继续更新,后续会探讨更多的概率论与统计相关的应用。
+ ← + + 求和 +
来源 --《算法导论》附录 A
+在分析算法的运行时间时,特别地,算法中包含 while 或 for 循环时,需要进行累加计算,形如:
数列求和是高中数学内容之一,先从最简单的等差数列开始复习:
其值为
大家应该还记得小高斯快速计算 1 + 2 + 3 + ... + 100 的故事,上面公式不难理解和推导。
+或许多多少少对这几个概念还有印象:
+公差:d
+首项:
+第 n 项:
+前 n 项和:
+通项公式:
不过这儿我们只关注数列和,即级数
平方和与立方和求和公式如下:
上面的两个公式用数学归纳法不难证明。我们也可以自己推导,以平方和为例:
+可以利用恒等式
对右侧累加求和,有
同样的方法,我们可以推导出立方和公式,这儿留给你自己推导。
+我们再回过头来看下奇数列:
可以用等式
对于
两步同乘以 x 有 +
当和是无限的并且|x|<1时,有无限递减几何级数 +
温习完等等差级数和几何级数,做两道题练习一下
A.1-4 证明
A.1-8 计算 $\prod_{k = 2}^n(1 - 1/k^2) 提示:无需转化为求和
调和级数是一个发散的无穷级数,第 n 个调和数是
在分析算法运行时间时,通常我们并不需要给出一个准确值,只需要描述出级数的界。比如,平方和级数
假定级数为
如下图所示,矩形总面积代表级数的值,曲线下方面积代表积分近似值,不难理解上述不等式。

如果
对于调和级数,我们由
BUILD-MAX-HEAP(A)
+ A.heap.size = A.length
+ for i = [A.length/2] downto 1
+ MAX-HEAPIFY(A, i)
+已知每次调用 MAX-HEAPIFY 的时间复杂度是 O(lgn),所以初步给出建堆的时间复杂度为 O(nlgn),不过这个上界不是渐近紧确的。 +可以观察到,叶子节点调用 MAX-HEAPIFY 次数最多,一直到根节点调用次数呈指数级收敛,而 MAX-HEAPIFY 运行时间只与高度有关。在一个高度为 h 的节点上运行 MAX-HEAPIFY 的代价是 O(h), 我们可以将 BUILD-MAX-HEAP 的总代价表示为
根据我们刚刚温习的知识,我们可以推导出
5.2-2)首先介绍下 HIRE-ASSISTANT 程序:面试 n 个候选人,如果当前候选人是目前最优秀的,就雇用它。
+现在假设应聘者以随机顺序出现,正好雇用两次的概率是多少?
为简单分析起见,我们假定n 个不同的数从 1 到 n,按数目大小比较是否优秀。以随机顺序出现,所有的排列有 n! 种情况。 +先来说说正好雇用一次的概率,也就是 n 个数中第一个就是最大的,概率是 1 / n 。刚好雇用 n 次的概率,也就是刚好按递增顺序排列,概率是 1 / n! +考虑到第一个和最优秀的总会被雇用,最优秀候选人在每个位置的概率相等均为 1 / n,假定最优秀的候选人所在位置为 k,那第一个应该是前 (k - 1) 个候选人中最优秀的,概率为 1/(k - 1)。
所以我们要求的概率为 +
现在看到这个求和是不是倍感亲切 😄
对于一个装载因子为
简单说下证明过程。一点概率知识:一个实验成功的概率为 p,那获得一次成功所需的实验次数的期望是
在算法分析中实际用到的并不多,不过这些级数本身就很有意思。
+ ← + + Hashing + + 概率分析 + + → +