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

ad00d93ca954547b1a18e9132aa58c8b.png

系列文章的导航链接:

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

上篇文章Part 2导航:

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

正文:

作者:@张靖昆

编辑:@张浩驰

Part1和Part2部分,我们考察的序列虽然有一定的“一般意义”但要求元素序列中的各个元素是各不相同的,那么如果我们遇到有元素重复的情况应该如何做呢,就是序列是多重集时该怎么做?

其实并不难,思路都是类似的,下面简单介绍一下:

我们在这里列出算法步骤,方便讨论:

步骤1. [初始化] 令

步骤2. [边界条件]

,则算法终止

步骤3. [比较] 如果

,则转至步骤5

步骤4. [改变

的值] 令

步骤5. [减小

] 让
,并返回步骤2

假设总共

个元素的多重集,其中共
个不同的值,即去重后剩余的元素数量。我们现在一步一步分析这些重复元素是如何影响的:

先思考一个问题:根据我们的算法,对于重复元素

当第一次遇到
之后,剩下的
对步骤4有什么影响?

很显然,有两种情况:

  1. 如果第1个
    比当前已知最大值小,那么剩下的
    都不会导致步骤4被执行;
  2. 如果第1个
    比当前已知最大值大,那么步骤4执行一次, 暂存最大值的
    将更新为
    ,这就导致剩下的
    同样不会导致步骤4执行。因为
    不会比
    更小。

也就是说,重复值中最多有一个值对步骤4产生影响,可以说我们可以砍掉这些重复元素,而细思一下,这不就是说这个序列只跟

有关,跟
无关么?!这种情况下,步骤4的执行次数最多是m-1次。

那么基于这个,可以粗糙的说,我们研究删除重复值之后的序列和研究原始序列是一致的。因为这种问题的本质是最长严格单调子序列的期望长度问题。在这个算法中,我们可以看成是以多重集最后一个元素为起点,倒序寻找最长严格递增子序列,当这个最长严格递增子序列确定后,步骤4的执行次数也就确定了。然而只有互不相同的值才能够改变最长严格子序列的长度,因此多重集n中真正有用的只有那m个互不相同的值,而剩下的重复值并不会对问题的研究产生任何影响!

不过要注意,以上只是说我们对多重集的研究可以转化为另一个等价问题的研究,而这个等价问题以m个元素作为研究对象。那么我们需要寻找一种可靠的转化方法,现在我们来论述这个方法:

其实很简单,我们将m个互不相同的值分别放到m个互不相交的集合中,然后将重复值放入到它所应该属的集合,也就是说每个集合内的数字应该完全相同,这样我们可以只考虑每个集合内的最后一个元素即可,举例说明:

例如5个元素组成的集合

,可以看到只有3个不同值,那么可以这样划分
,共有3!=6个排列。对这个问题的研究和对原序列是等价的,因为无论是划分前还是划分后,A只可能取值为0,1,2,并且划分前无论令A为0,还是1,还是2的序列个数的占比和划分后是一样的,大家可以手动计算一下,非常简单,原理就是我之前说的,影响A的取值的是最长严格单调子序列的长度。相信你会懂得~

***现在可以下定论,这里不予以解释,大家可自行思考:

  1. 假设存在包含n个互不相同元素的基础集,我们做一种实验使得这
    个元素按照一定次序排列从而得到一个序列,那么
    无论这个序列是以何种方式产生的(概率分布如何),基于这些序列运行“寻找最值”算法,步骤4的期望步数的分析方法都不变,即都可适用Part 2文章所讲的。因为Part 2中所述分析方法所基于的样本空间只是
    排列,跟分布无关!
  2. 而对于多重集的情况,做实验的方法将影响到m的变化,即distinct值的数量m将是一个随机变量,但依旧可以采用本文所说的方法,将包含n个元素的多重集转化为Part 2中所述针对包含m个互不相同元素序列的等价问题进行求解,也就是说Part 2中文章得到的结果仍然适用
    ,这里
    是调和级数的表示方法。
    但是!!!这里
    将是一个随机变量!!!这就是说,最终的期望要考虑到
    的概率分布!!

好了,到这里,精读笔记1就结束了。。相信你对算法分析的有了一个更深刻的理解~

下期关于渐进记号的讲解,你不应该只知道Big-O即大O符号!~~

27f6de2de87871bd2908653573846071.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机程序设计艺术》(The Art of Computer Programming)是计算机科学界的经典著作,由“计算机之父”唐纳德·E·科恩思(Donald E. Knuth)撰写。该系列作品共有4卷,其中第三卷的全称是《计算机程序设计艺术-卷3》,简称为《TAOCP Vol.3》。 《TAOCP Vol.3》主要讨论的是排序与查找算法。在计算机领域中,排序和查找是非常重要的基本操作。排序是将数据按照一定的顺序进行排列,而查找则是在已排好序的数据中查找某个特定的元素。这两个操作在日常生活和软件开发中都有广泛的应用。 在《TAOCP Vol.3》中,科恩思详细讲解了各种排序和查找算法的原理和实现方法。他从数学和计算机科学的角度出发,深入剖析了这些算法的性能评估和优化。对于每个算法,他给出了详细的伪代码和复杂度分析,帮助读者深入理解算法的内部运行机制和优化技巧。 除了排序和查找算法,科恩思还涉及了其他一些相关的内容,如外排序、字符串匹配和数据压缩等。他提出了一些新的思想和技术,并给出了具体的实现方法和应用场景。 《TAOCP Vol.3》不仅仅是一本教科书,更是一本经典的参考书。它为计算机科学领域的学习者和从业者提供了深入研究的基础和指导。阅读和理解这本书将帮助读者提高算法设计和优化的能力,从而提高程序的效率和质量。 总之,科恩思的《计算机程序设计艺术-卷3》是一本经典的著作,它详细介绍了排序和查找算法以及相关内容,对于计算机科学领域的学习和研究具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值