天才ACM

这篇文章分析时间复杂度,假设最终分出来的序列的长度分别是len1,len2,...,lenk

一.普通倍增(指从大到小循环):,O(n2logn)

在算leni时,倍增倒序循环时,我们每次都会对新增的部分进行快速排序,时间复杂度为O(nlogn+n2logn2+...)=O(nlogn);而每次合并的时候用的归并排序,不妨将每次合并的长度都看成leni,于是合并的时间复杂度为O(lenilogn)

对所有的序列求和,复杂度为O(knlogn+nlogn),由于k最坏为n,所以时间复杂度为O(n2logn)

二.蓝书倍增:O(nlogn)

首先说明一下,按照蓝书的倍增方法,长度一旦开始除以2之后,长度都不可能再翻倍,只能一直除以2,用数学归纳法可以证明

举个例子,假设长度在递增的变化分别是1 2 4 8 16 32 64,然后接下来发现128不能继续拓展了,那就回到64,假设也不能,那就变成32,假设可以拓展了,32是没有必要回到64的,因为如果可以的话,那么在之前第一次从128回到64的时候肯定就可以,但是实际上不可以,所以64不可以,继续保持32也不可以,否则的话相当于就可以加32+32=64,也就是发现128不行的时候,加64却可以,但是实际上加64不可以,所以32也不行,只能试16

于是对于leni,每次只对新增的部分进行快速排序,有O(2(lenilogleni+leni2logleni2+...))=O(lenilogleni)(乘以2是在算后面长度除以2的时候进行排序的复杂度),归并的时间复杂度是O(lenilogleni)

对所有的序列求和,复杂度为O(nlogn)

posted @   最爱丁珰  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示