首页 > 其他分享 >经典复杂度

经典复杂度

时间:2023-10-11 16:45:37浏览次数:29  
标签:frac log dfrac 复杂度 sqrt 经典 sum

整除分块套整除分块

也就是求:

\[O\left(\sum_{i=1}^{\sqrt n}\sqrt{\frac{n}{i}}\right) \]

设 \(f(n)=\sum\limits_{i=1}^{n}\dfrac{1}{\sqrt{i}}\),那么原式就是 \(O(\sqrt n\times f(\sqrt n))\),因此我们只需要求 \(f(n)\) 即可。

把 \(f(n)\) 从求和式改写为积分式,也就是:

\[f(n)=\int_{1}^n \frac{1}{\sqrt x} dx \]

容易得到 \(f(n)=O(\sqrt n)\),故原式等于 \(O(n^{\frac{3}{4}})\)。

杜教筛

如果用线性筛预处理前 \(B\) 个,那么杜教筛的复杂度可以被表示为:

\[O(B+\sum_{i=1}^{n/ B}\sqrt{\frac{n}{i}}) \]

类似的,原式可以被表示为 \(O(B+\sqrt n\times \sqrt \frac{n}{B})=O(B+\frac{n}{\sqrt B})\),用均值不等式可以得出其最优复杂度在 \(B=n^{\frac{2}{3}}\) 时取到,为 \(O(n^{\frac{2}{3}})\)。

树剖复杂度

  • 为什么树剖的复杂度是 \(O(\log n)\) 的?

容易发现,树剖的复杂度等于两点之间的重链数,而两点之间的重链数又于两点之间的虚边数同阶。

由于树剖每次都选取最大的子节点作为重儿子,因此若一个点经过虚边到达父节点,那么子树大小一定至少 \(\times 2\)。

考虑反证法,如果没有至少 \(\times 2\),那么这就意味这自己的子树大小与父节点子树大小的比值大于 \(\dfrac{1}{2}\),那么自己就一定是父节点的重儿子(不可能有两个节点的子树大小都大于父节点的 \(\dfrac{1}{2}\)),与自己是轻儿子的事实相反。

翻倍的次数最多 \(O(\log n)\) 次,因此虚边数是 \(O(\log n)\) 的,故树剖的复杂度是 \(O(\log n)\)。

点分治的复杂度证明类似。

调和级数套快速幂

也就是求:

\[O\left(\sum_{i=1}^n\sum_{j=1}^{\frac{n}{i}}\log \frac{n}{ij}\right) \]

设 \(f(n)=\sum\limits_{i=1}^n\log\dfrac{n}{i}\),那么原式就是 \(\sum\limits_{i=1}^n f(\dfrac{n}{i})\),我们先求 \(f(n)\)。

构造方程 \(\log \dfrac{n}{x} = y\),解得 \(x=\dfrac{n}{2^y}\),也就是说,在 \(1\sim n\) 的 \(\log \dfrac{n}{i}\) 中,比 \(x\) 大的有 \(\dfrac{n}{2^x}\) 个,那么等于 \(x\) 的就有 \(\dfrac{n}{2^{x-1}}-\dfrac{n}{2^x}=\dfrac{n}{2^{x-1}}\) 个,因此,我们可以将 \(f\) 转化为个数累加式(就是所有的值乘上这个值出现的次数):

\[f(n)=\sum_{i=1}^n\log\frac{n}{i}=\sum_{i=1}^{\infty}i\times \frac{n}{2^{i-1}}=O(n \sum_{i=1}^{\infty}\frac{i}{2^i}) \]

后半部分是一个等差数列乘等比数列的无限项和,用错位相减法容易得到其值为常数 \(2\),因此 \(f(n)=O(n)\)。

那么原式就等于 \(O(\sum\limits_{i=1}^n\dfrac{n}{i})=O(n\log n)\)。

标签:frac,log,dfrac,复杂度,sqrt,经典,sum
From: https://www.cnblogs.com/TKXZ133/p/17757584.html

相关文章

  • 渐进时间复杂度
         ......
  • shell_条件判断_逻辑运算经典实例
    逻辑开发应用实例限制输入只能是1或2的数字################[root@localhostshell_rpo]#shtest_andor2.shpleaseinputacharf######录入了字符f出现了报错的情况,初步估计是,判断逻辑的1和2加了引号的缘故,表示数字比较test_andor2.sh:第9行:[:f:期待整数表达式......
  • 16个经典项目管理模型
            ......
  • TextRCNN、TextCNN、RNN…你都掌握了吗?一文总结文本分类必备经典模型(一)
     本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过SOTA的经典模型逐一详解。前往SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。本文将分3期进行连载,共介绍 20 个在文本分类任务上......
  • TextCNN、DCNN、AttentionXML…你都掌握了吗?一文总结文本分类必备经典模型(二)
    https://mp.weixin.qq.com/s/f5SkoWD4BY_HDWfPi5R5ng 本专栏将逐一盘点自然语言处理、计算机视觉等领域下的常见任务,并对在这些任务上取得过SOTA的经典模型逐一详解。前往SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。本......
  • 聊聊前端算法复杂度
    算法复杂度前端开发一般:重时间轻空间什么是复杂度程序执行时需要的计算量和内存空间(和代码简洁度无关)复杂度是数量级,不是具体的数字一般针对一个具体的算法,而非一个完整的系统时间复杂度程序执行时需要的计算量(cpu)O(1)一次就够"可数的",和输入量无关,无论输入量......
  • 45 个 Git 经典操作场景,专治不会合代码(转)
    45个Git经典操作场景,专治不会合代码git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。下边我......
  • Linux系统中驱动入门设备树DTS(经典)
    设备树(DTS:devicetreesource),字面意思就是一块电路板上设备如上图中CPU、DDR、I2C、GPIO、SPI等,按照树形结构描绘成的一棵树。按照策略和功能分离的思路,就是驱动代码(功能)和设备树DTS配置文件(策略)分开来进行设计,这样针对不同的电路板,Linux驱动代码就不用动了,只需要改改DTS就可以,DTS......
  • 子树合并背包类型的 dp 的复杂度证明
    首先,我们发现,转移一颗子树的背包,实际上就是把该子树的根节点的所有儿子的子树背包合并,再与根节点合并。具体的,合并两颗子树的转移方程式如下:\[f(u,i)=\max\limits_{j+k=i}\{f(v_1,j)+f(v_2,k)\}\]于是有如下伪代码:dfs(u): su=1 f(u,1)=w[u] for(vinu) sv=siz......
  • 一道关于局部变量、成员变量以及传参的经典题目
    publicclassTest{staticints;inti;intj;{inti=1;i++;j++;s++;}publicvoidtest(intj){j++;i++;s++;}publicstaticvoidmain(String[]args){......