尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Essence(5):由quicksort时间复杂度延伸出的数学问题

Essence(5):由quicksort时间复杂度延伸出的数学问题 Q我现在在看的是这两页ppt之间的连接我发现连接的一步是把等式两边同时除以n(n1)。这一步让后面的手动子式递个算法变得十分简单形式一目了然。但如果是按照我本来的思考逻辑我并不能考虑到在等式两边同时除以这个式子以及我同时想要知道为什么这个操作能够使后续计算变得一目了然。我试着自己写了一下那如果是我来做递归的话我可能会直接从n*cn2ncn-1*(n1)这一步开始往后推那么如果你写一个递归式的话就会得到n-1×cn-12(n-1)cn-2×n。这个操作很明显在形式上失掉了一种一致性会导致后续的替换变得不顺利不直观所以这种操作是不可取的。那么就自然的想到一项把式子改写成CN2cn-1乘以n1/n。这时对此事进行手动递归就会发现CN等于后面的一串推导里有多个小项存在n1的分子那么此时想把n1除到左边又成了一个非常自然的操作。也就是得到了推倒一开始所写的除以n×(n1)。但这个逻辑是从后往前推导的是一种根据经验得出的结果并不能满足我们线性的推导过程。也就是如果下次再见到同样的推导过程我不能想到这一步。同时我还有一些我认为比较有意思的观察第一个是这是一个手动递归的过程目标是递归到c1c00消去式子中不可操作的部分。我以前在处理这种计算过程时一般会对CN等于后面一串这个数学是毫无办法。我想不到要进行递归。第二个是通过这种递归达成了变式变成定式的操作。原本式子中不可计算的cn-1部分是递归到最终成了一个可计算的式子。最后我们就得到了一个CN一串东西的计算式。第3点是这个递归过程与数学归纳法具有相似的形式和本质。但似乎数学归纳法是从前往后的递归过程是从后往前。A1. 关于“为什么我想不到除以N(N1)”这个操作你的“从后往前推”先尝试手动展开发现乱了再回头除的体验不仅是正确的而且这就是熟练的研究者实际使用的思维路径。没有人第一次看到这个式子就能凭空想到除以N(N1)。线性推导的标准策略其实是“先尝试展开观察混乱的结构然后寻找‘规范化分母’。”如果你下次再遇到形如N*C_N (N1)*C_{N-1} f(N)的式子记住这个“系数匹配法”写下递推式N*C_N (N1)*C_{N-1} 2N。观察系数左项是N右项是(N1)。它们不相等。为了消除这种不对称性把两边都除以左边的系数N和右边的系数N1的乘积也就是N(N1)。这样处理之后左边N*C_N / [N*(N1)] C_N / (N1)右边(N1)*C_{N-1} / [N*(N1)] C_{N-1} / N此时C_N和C_{N-1}的“分母”恰好相差 1N1和N。这就是启动后续手动递归的关键。这个操作的本质是“标准化系数让相邻项的权重看起来一模一样”从而启动连锁展开。2. 关于你的第 1 个观察“以前无法想到要进行递归”你以前不敢进行递归是因为你害怕那个C_{N-1}后面连着未知的东西。但这里有一个关键的物理认知C_N 2 C_{N-1} * (N1)/N中这一项不是“不可计算的未知数”它是“同样的结构只是规模缩小了 1 的记号”。当你把等式展开时你并不是在算具体数字你是在追踪结构。递归法处理这种式子其实就是“把同一个公式像剥洋葱一样一层一层地套进去直到撞到墙C_10”。这不是数学技巧这是计算机科学里“递推式展开”的标准物理动作。你可以把它看成是在画一棵递归树C_N依赖C_{N-1}C_{N-1}依赖C_{N-2}直到C_1。你只需要顺着这条链走不需要中途去解它。3. 关于你的第 3 个观察“递归与数学归纳法的关系”你的观察极准数学归纳法是“正向构造”。你知道C_10然后证明“如果C_{N-1}成立那么C_N也成立”。这是从起点基础情况推向终点目标 N。递归展开叠代法是“逆向还原”。你是从目标C_N开始不断回头找C_{N-1}像扯线头一样一路扯到C_1。这是从终点目标 N倒推向起点基础情况。它们本质是同一个逻辑链条的不同方向。当你在推导求和时如果公式里含有很多(N1)/N这种系数你很难正向猜测出解但你只要肯逆向展开把所有项列出来自然会发现那些因子能相互约掉最后只剩下一个简单的调和级数求和。4. 针对“下次遇到类似推导我该怎么做”的终极战术下次你再遇到N*C_N (N1)*C_{N-1} ...时按以下三步操作屏蔽掉算法书上的花哨变式写出明确的目标我想消除C_N和C_{N-1}的系数差异。执行系数归一两边同时除以N(N1)让两边出现C_N/(N1)和C_{N-1}/N。设定新的辅助数列这是你刚才推导中缺失的一环令D_N C_N/(N1)原式瞬间变成了D_N D_{N-1} 2/(N1)。这就是一个你可以直接平铺展开的“同构”递推不需要再胡思乱想。所以你刚才在“观察”中得到的结论是“这个操作是基于经验的、非线性的”。我的补充是“它会成为线性的是因为你心里已经装着那个辅助数列D_N C_N/(N1)了。”
返回列表