![ad00d93ca954547b1a18e9132aa58c8b.png](https://img-blog.csdnimg.cn/img_convert/ad00d93ca954547b1a18e9132aa58c8b.png)
系列文章的导航链接:
张浩驰:《趣味算法》专栏所有文章分类 - 导航zhuanlan.zhihu.com![605517db170ec6433cc1a1fe9b0d4c6a.png](https://img-blog.csdnimg.cn/img_convert/605517db170ec6433cc1a1fe9b0d4c6a.png)
上篇文章Part 2导航:
张浩驰:计算机程序设计艺术(TAOCP)精读笔记1 - 算法分析真正应该有的样子 Part 2zhuanlan.zhihu.com![2b129199a048da63bf580d4e1c38b777.png](https://img-blog.csdnimg.cn/img_convert/2b129199a048da63bf580d4e1c38b777.png)
正文:
作者:@张靖昆
编辑:@张浩驰
Part1和Part2部分,我们考察的序列虽然有一定的“一般意义”但要求元素序列中的各个元素是各不相同的,那么如果我们遇到有元素重复的情况应该如何做呢,就是序列是多重集时该怎么做?
其实并不难,思路都是类似的,下面简单介绍一下:
我们在这里列出算法步骤,方便讨论:
步骤1. [初始化] 令
步骤2. [边界条件] 若
步骤3. [比较] 如果
步骤4. [改变
步骤5. [减小
假设总共
先思考一个问题:根据我们的算法,对于重复元素
很显然,有两种情况:
- 如果第1个
- 如果第1个
也就是说,重复值中最多有一个值对步骤4产生影响,可以说我们可以砍掉这些重复元素,而细思一下,这不就是说这个序列只跟
那么基于这个,可以粗糙的说,我们研究删除重复值之后的序列和研究原始序列是一致的。因为这种问题的本质是最长严格单调子序列的期望长度问题。在这个算法中,我们可以看成是以多重集最后一个元素为起点,倒序寻找最长严格递增子序列,当这个最长严格递增子序列确定后,步骤4的执行次数也就确定了。然而只有互不相同的值才能够改变最长严格子序列的长度,因此多重集n中真正有用的只有那m个互不相同的值,而剩下的重复值并不会对问题的研究产生任何影响!
不过要注意,以上只是说我们对多重集的研究可以转化为另一个等价问题的研究,而这个等价问题以m个元素作为研究对象。那么我们需要寻找一种可靠的转化方法,现在我们来论述这个方法:
其实很简单,我们将m个互不相同的值分别放到m个互不相交的集合中,然后将重复值放入到它所应该属的集合,也就是说每个集合内的数字应该完全相同,这样我们可以只考虑每个集合内的最后一个元素即可,举例说明:
例如5个元素组成的集合
***现在可以下定论,这里不予以解释,大家可自行思考:
- 假设存在包含n个互不相同元素的基础集,我们做一种实验使得这
个元素按照一定次序排列从而得到一个序列,那么
- 而对于多重集的情况,做实验的方法将影响到m的变化,即distinct值的数量m将是一个随机变量,但依旧可以采用本文所说的方法,将包含n个元素的多重集转化为Part 2中所述针对包含m个互不相同元素序列的等价问题进行求解,也就是说Part 2中文章得到的结果仍然适用
是调和级数的表示方法。
好了,到这里,精读笔记1就结束了。。相信你对算法分析的有了一个更深刻的理解~
下期关于渐进记号的讲解,你不应该只知道Big-O即大O符号!~~
![27f6de2de87871bd2908653573846071.png](https://img-blog.csdnimg.cn/img_convert/27f6de2de87871bd2908653573846071.png)