首页 > 其他分享 >分治

分治

时间:2023-03-11 23:34:14浏览次数:23  
标签:log cdot dfrac 复杂度 分治 排序 sigma

乘法的优化

暴力的乘法复杂度是\(O(n^2)\)的。

如果两个\(n\)位数\(x,y\)相乘(我们保证\(n\)是2的幂),那么我们按位把\(x\)分成\(x_L,x_R\)两半,\(y\)分成\(y_L,y_R\),使得\(x=x_L \cdot 2^{n/2}+x_R,y=y_L \cdot 2^{n/2}+y_R\)。那么\(xy=x_Ly_L \cdot 2^n + (x_Ly_R+x_Ry_L)\cdot 2^{n/2}+x_Ry_R\)。加法和乘以2的幂次都是\(O(n)\)的,而余下的乘法可以递归的完成。设两个\(n\)位数的乘法所需时间是\(T(n)\)。那么有递推关系\(T(n)=4T(n/2)+O(n)\)。可以画出递归树解得\(T(n)=O(n^2)\)。

利用Guass's Trick,我们可以进行优化。我们可以计算出\(x_ly_L,x_Ry_R\),再计算出\((x_L+x_R)(y_L+y_R)\),用第三个数减去前两个数就可以得到交叉项。这样四次乘法就被优化到了三次。此时\(T(n)=3T(n/2)+O(n)\)。这时解变成了\(T(n)=O(n \cdot \left(\dfrac{3}{2}\right)^{\log n})=T(3^{\log_2 n})=T(n^{\log_2 3})\approx T(n^{1.59})\)

主定理

从上述例子中可以发现,分治算法的复杂度分析一般式为:

\(T(n)=aT(n/b)+O(n^d)\)

其中假设\(n\)是\(b\)的幂。

我们依然画出递归树。得到(\(k=\log_b n\))

\(T(n)=O\left(n^d+a \cdot \dfrac{n^d}{b^d}+a^2 \cdot \dfrac{n^d}{(b^2)^d}+\cdots+a^k \cdot \dfrac{n^d}{(b^k)^d}\right)\)

这是等比数列,公比为\(\dfrac{a}{b^d}\)。因此需要分类讨论。

当\(a>b^d\)时,\(T(n)=O(n^d \cdot \dfrac{\frac{a^k}{b^{dk}}-1}{\frac{a}{b^d}-1})=O(a^{\log_b n})=O(n^{\log_b a})\)

当\(a=b^d\)时,\(T(n)=O(n^d \cdot k)=O(n^d \cdot \log_b n)=O(n^d \log n)\)

当\(a<b^d\)时,\(T(n)=O(n^d \cdot \dfrac{1-\frac{a^k}{b^{dk}}}{1-\frac{a}{b^d}})=O(n^d)\)

排序

归并排序满足\(T(n)=2T(n/2)+O(n)\),解得\(T(n)=O(n \log n)\)。我们可以证明基于比较的排序算法不可能比这更优。

考虑给一个全排列\(\sigma\)排序,第一次比较\(\sigma_{i_1},\sigma_{j_1}\)两个元素。\(\sigma\)分为两类,一类满足\(\sigma_{i_1}<\sigma_{j_1}\),一类满足\(\sigma_{i_1}>\sigma_{j_1}\);在每一类中,又可以分为\(\sigma_{i_2}<\sigma_{j_2}\)和\(\sigma_{i_2}>\sigma_{j_2}\)。如果把这种分类看成一颗二叉树的话,它的叶节点就有\(n!\)个。排序算法的优劣就在于怎么选择每一次的\(i_k,j_k\),因为这决定了二叉树的形态。为了让排序算法最优秀,一定要让最坏的也就是深度最大的叶节点的深度尽量小。因此这应当尽量是一颗平衡树(满二叉树),此时最大深度为\(\log_2 (n!)\)。根据Stirling's Formula,\(n! \sim \sqrt{2n\pi}\left(\dfrac{n}{e}\right)^n\),因此\(O(\log n!)=O(n \log n)\)。可见任何排序算法的比较次数都不可能小于\(O(n \log n)\)这个量级。

Medians

求中位数的复杂度是可以优于排序的复杂度的。我们每次随机选择一个数\(v\),把小于\(v\)的和大于\(v\)的挑出来,转化成在新的数组里找第\(k\)小的问题。我们不停随机这个\(k\),直到挑到\(v\)的排名在\(1/4\)到\(3/4\)之间。由于概率为\(1/2\),随机次数的期望是\(1/2+1/4+\cdots=2\)。因此可以写出期望复杂度\(T(n)=T(3/4n)+O(n)\),解得\(T(n)=O(n)\)。

在理论计算机导论中,还学过一个并不随机的算法Median of Medians,复杂度是\(T(n)=T(\dfrac{n}{5})+T(\dfrac{7n}{10})+O(n)\),解得\(T(n)=O(n)\)。

标签:log,cdot,dfrac,复杂度,分治,排序,sigma
From: https://www.cnblogs.com/qixingzhi/p/17207353.html

相关文章

  • 快速幂——分治思想
    问题:求解pow(x,n)解题思路:1.将n个x相乘,时间复杂度为O(n)2.分治思想:二进制数转化成10进制数的方法:二进制数为n=2k-1 *ak  + 2k-2*ak-1+......
  • 【算法设计-分治】递归与尾递归
    目录1.阶乘尾递归:递归的进一步优化2.斐波那契数列3.最大公约数(GCD)4.上楼梯5.汉诺塔(1)输出移动过程输出移动步数5.汉诺塔(2)输出移动过程输出移动步数6.杨辉三角形7.完......
  • 【算法设计-枚举、分治】素数、约数、质因数分解
    目录1.素数判定2.素数筛选法3.质因数分解4.求一个数的约数5.求两个数的最大公约数(GCD)6.求两个数的最小公倍数(LCM)1.素数判定判定从2到sqrt(n)依次能否把n整除,......
  • F. Timofey and Black-White Tree 2100 (树 根号分治 思维)
    https://codeforces.com/problemset/problem/1790/F题意:给定一棵树,需要将其染为全黑,初始时只有一个点为黑色,给定一个序列c,按招顺序染色,要求每次染色后给出当前任意两黑点......
  • (转)数据结构和算法(Golang实现)(8.2)基础知识-分治法和递归
    原文:https://juejin.cn/post/6844904132378263565分治法和递归在计算机科学中,分治法是一种很重要的算法。字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多......
  • 【算法设计-分治思想】快速幂与龟速乘
    目录1.快速幂2.龟速乘3.快速幂取模4.龟速乘取模5.快速幂取模优化1.快速幂算法原理:计算311:311=(35)2x335=(32)2x332=3x3仅需计算3次,而非11......
  • 多叉分治半在线卷积
    唔,把以前一直口胡着的多叉分治半在线卷积实现了一下啊!这个算法的思想是,我们分治计算贡献时,设目前区间长度为\(n\),分成\(B\)个部分,并且用cdq的方式计算贡献,其中\(B\)......
  • 题解 北大集训2018 点分治
    题意给定\(n\)个点的树,求点分治方案数,对\(10^9+7\)取模。两种方案不同当且仅当点分树不同。\(1\leqn\leq5000\)题解考虑怎样合并两个点分治方案。如果我们有......
  • 【YBT2023寒假Day15 C】缺口一样(数论)(莫队)(根号分治)
    缺口一样题目链接:YBT2023寒假Day15C题目大意给你一个序列,多次询问,每次问你一个区间这里面所有非空点集的最大公约数之积,对质数取模。思路首先质因子之间是独立的,考虑......
  • 点分治练习题单(动态更新)
    传送门有点难,慢慢做。1.P2634[国家集训队]聪聪可可比板子要简单一点,分治时寻找路径时用桶记录模数为\(0,1,2\)的个数,再进行\(01\)背包即可。统计答案时由于两点可......