IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【简单的递归复杂度计算与思考】T(n)=P(n)+aT(n/b) -> 正文阅读

[数据结构与算法]【简单的递归复杂度计算与思考】T(n)=P(n)+aT(n/b)

前言

  • 大多都为自己的闲暇思考。
    可能会有错误的或者表述不正确的地方,见谅。

  • 符号说明
    下述例子, T ( n ) T(n) T(n) 表示数据规模为 n n n 的时间复杂度
    O ( n ) O(n) O(n) 表示大 O O O 计数法,即最坏复杂度
    下述例子默认边界条件 T ( 1 ) = O ( 1 ) T(1)=O(1) T(1)=O(1)
    题目都为求解 T ( n ) T(n) T(n) 的非递推公式。

题目

  • 计算
    T ( n ) = F ( n ) + a T ( n b ) T(n)=F(n)+aT(\frac{n}{b}) T(n)=F(n)+aT(bn?)
    其中 F ( n ) F(n) F(n) 为一个关于 n n n简单函数
    这里简单函数:指幂函数、常函数,或上述函数的简单加减(多项式函数)。
    我们通常使用 P ( x ) P(x) P(x) 表示(虽然下文中都使用了 F ( x ) F(x) F(x)
  • (更新)注
    指数函数和对数函数在这里不能使用本文提到的做法来做,原因在思考二中。

思考一


  • T ( n ) = 2 T ( n / 2 ) T(n)=2T(n/2) T(n)=2T(n/2)
  • 容易得到,是一个等比数列,首项为1,公比为2,递归层数为 ? log ? 2 n ? + 1 \lfloor \log_2n \rfloor +1 ?log2?n?+1 T ( 0 ) T(0) T(0)
    即递归次数 ? log ? 2 n ? \lfloor \log_2n \rfloor ?log2?n? T ( 1 ) T(1) T(1)
    T ( n ) = O ( 2 log ? 2 n ) = O ( n ) T(n)= O(2^{\log_2 n})=O(n) T(n)=O(2log2?n)=O(n)
    注:由于大 O O O 计数法,忽略常数,若数不为2的幂次,应该计算得到为 n ~ 2 n n\sim 2n n2n 的一个数。
    手模拟也可以得到, T ( 1 ) = 1 , T ( 2 ) = 2 , T ( 4 ) = 4 , e t c . T(1)=1,T(2)=2,T(4)=4,etc. T(1)=1,T(2)=2,T(4)=4,etc.

思考二


  • T ( n ) = F ( n ) + 2 T ( n / 2 ) T(n)=F(n)+2T(n/2) T(n)=F(n)+2T(n/2)
  • 首先容易得到, T ( n ) T(n) T(n) 是不低于 O ( n ) O(n) O(n) 的,因为 F ( n ) 至 少 O ( 1 ) F(n)至少O(1) F(n)O(1)
    我们若只考虑 2 2 2 的幂次
    然后,由于每一次 n → n / 2 n\rightarrow n/2 nn/2 ,我们可以想到,迭代次数为 ? log ? 2 n ? \lfloor \log_2n \rfloor ?log2?n?,即上述等价于
    T 2 ( x ) = F ( 2 x ) + 2 T 2 ( x ? 1 ) T_2(x)=F(2^x)+2T_2(x-1) T2?(x)=F(2x)+2T2?(x?1)
    其中 T ( n ) = T 2 ( ? log ? 2 n ? ) = T 2 ( l o g 2 n ) T(n)=T_2(\lfloor \log_2n \rfloor)=T_2(log_2n) T(n)=T2?(?log2?n?)=T2?(log2?n) 因为我们只考虑 2 2 2 的幂次。
  • 由于数据规模越大, F ( 2 x ) F(2^x) F(2x) 是应当越来越大的。
    容易看出来,这是一个等比数列变种。我们设:
    T 2 ( x ) + F ( 2 x ) c = 2 ( T 2 ( x ? 1 ) + F ( 2 x ? 1 ) c ) 其 中 c 是 常 数 (1) T_2(x)+\frac{F(2^x)}{c} =2(T_2(x-1)+\frac{F(2^{x-1})}{c})\qquad 其中c 是常数\tag{1} T2?(x)+cF(2x)?=2(T2?(x?1)+cF(2x?1)?)c(1)
    通过移项,我们可以得到:
    2 F ( 2 x ? 1 ) ? F ( 2 x ) c = F ( 2 x ) \frac{2F(2^{x-1})-F(2^x)}{c}=F(2^x) c2F(2x?1)?F(2x)?=F(2x)

    c = 2 F ( 2 x ? 1 ) ? F ( 2 x ) F ( 2 x ) c=\frac{2F(2^{x-1})-F(2^x)}{F(2^x)} c=F(2x)2F(2x?1)?F(2x)?
    我们目前可以做的内容,就是 F ( n / 2 ) F ( 2 n ) = ( F ( n ) ) 2 F(n/2)F(2n)=(F(n))^2 F(n/2)F(2n)=(F(n))2 情况下的分析。
    这样的话, c c c 就是一个常数。
    对于幂函数,注意到,如果 F ( n ) = a n b F(n)=an^b F(n)=anb 的话是成立的。
    由于我们是大 O O O 计数,故只记录 F ( n ) F(n) F(n) 的最高次项即可,忽略低次项。
    可以看出来,分母大于 1 1 1,分母 2 F ( 2 x ? 1 ) ? F ( 2 x ) 2F(2^{x-1})-F(2^x) 2F(2x?1)?F(2x) 决定了 c c c 的符号,或者 c = 0 c=0 c=0

c ≠ 0 c\ne 0 c?=0,我们接下来可得

  • 于是,我们由 ( 1 ) (1) (1) 可以得到:
    T 2 ( x ) + F ( 2 x ) / c T 2 ( x ? 1 ) + F ( 2 x ? 1 ) / c = 2 \frac{T_2(x)+F(2^x)/c}{T_2(x-1)+F(2^{x-1})/c}=2 T2?(x?1)+F(2x?1)/cT2?(x)+F(2x)/c?=2
    S ( x ) = T 2 ( x ) + F ( 2 x ) / c S(x)=T_2(x)+F(2^x)/c S(x)=T2?(x)+F(2x)/c,边界条件 S ( 1 ) = T 2 ( 1 ) + F ( 2 ) / c = O ( 1 ) + F ( 2 ) / c = o ( 1 ) S(1)=T_2(1)+F(2)/c=O(1)+F(2)/c=o(1) S(1)=T2?(1)+F(2)/c=O(1)+F(2)/c=o(1)
    得到: S ( x ) = S ( 1 ) × 2 x ? 1 S(x)=S(1)\times 2^{x-1} S(x)=S(1)×2x?1
    即我们得到了:
    S ( x ) = T 2 ( x ) + F ( 2 x ) / c = 2 x ? 1 × o ( 1 ) T 2 ( x ) = 2 x ? 1 × o ( 1 ) ? F ( 2 x ) / c S(x)=T_2(x)+F(2^x)/c=2^{x-1}\times o(1)\\ T_2(x)=2^{x-1}\times o(1)-F(2^x)/c S(x)=T2?(x)+F(2x)/c=2x?1×o(1)T2?(x)=2x?1×o(1)?F(2x)/c
    我们转换为 T ( n ) T(n) T(n),便得到了:
    T ( n ) = O ( n ) ? F ( n ) / c (2) T(n)=O(n)-F(n)/c \tag{2} T(n)=O(n)?F(n)/c(2)
  • 我们得到了结论:
    c > 0 c >0 c>0,那么 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)
    c < 0 c<0 c<0,那么 T ( n ) = O ( n ? F ( n ) / c ) = O ( n + ( F ( n ) ) 2 F ( n ) ? 2 F ( n / 2 ) ) T(n)=O(n-F(n)/c)=O(n+\cfrac{(F(n))^2}{F(n)-2F(n/2)}) T(n)=O(n?F(n)/c)=O(n+F(n)?2F(n/2)(F(n))2?)

c = 0 c=0 c=0 则是接下来的思考

  • 由于 c = 0 c=0 c=0 ,那么一定有 F ( 2 x ) = 2 F ( 2 x ? 1 ) = 2 x ? 1 F ( 1 ) F(2^x)=2F(2^{x-1})=2^{x-1}F(1) F(2x)=2F(2x?1)=2x?1F(1)
    那么式子表示成:
    T 2 ( x ) = 2 x ? 1 F ( 2 1 ) + 2 T 2 ( x ? 1 ) = 2 x + 2 T 2 ( x ? 1 ) T_2(x)=2^{x-1}F(2^1)+2T_2(x-1)=2^x+2T_2(x-1) T2?(x)=2x?1F(21)+2T2?(x?1)=2x+2T2?(x?1)
  • 由于我们小学二年级就在 《算法导论》1学过这种式子怎么搞,很明显,我们可以看做一个塔,然后瞎搞去算。
  • 但是我们之前学过优雅的 特征方程求解非齐次递推线性方程
    特征方程为 λ 2 ? 2 λ = 0 \lambda^2-2\lambda =0 λ2?2λ=0 得到 λ 1 = 0 , λ = 2 \lambda_1=0,\lambda=2 λ1?=0,λ=2
    设递推方程通解为 T 2 ( x ) = c 2 x T_2(x)=c2^x T2?(x)=c2x
    由于非齐次项为 2 x 2^x 2x,为一重根。
    设递推方程通解为 T 2 ( x ) = c 1 2 x + c 2 x 2 x T_2(x)=c_12^x+c_2x2^x T2?(x)=c1?2x+c2?x2x
    初始项为 T 2 ( 0 ) = 0 , T 2 ( 1 ) = 2 T_2(0)=0,T_2(1)=2 T2?(0)=0,T2?(1)=2,得到 T 2 ( x ) = x 2 x T_2(x)=x2^x T2?(x)=x2x
  • T ( n ) = T 2 ( log ? 2 n ) = O ( log ? 2 n × n ) = O ( n log ? 2 n ) T(n)=T_2(\log_2n)=O(\log_2n\times n)=O(n\log_2n) T(n)=T2?(log2?n)=O(log2?n×n)=O(nlog2?n)

综上

  • c = 2 F ( n / 2 ) ? F ( n ) F ( n ) c=\frac{2F(n/2)-F(n)}{F(n)} c=F(n)2F(n/2)?F(n)?
  • c > 0 c >0 c>0,那么 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)
    c < 0 c<0 c<0,那么 T ( n ) = O ( n ? F ( n ) / c ) = O ( n + ( F ( n ) ) 2 F ( n ) ? 2 F ( n / 2 ) ) T(n)=O(n-F(n)/c)=O(n+\cfrac{(F(n))^2}{F(n)-2F(n/2)}) T(n)=O(n?F(n)/c)=O(n+F(n)?2F(n/2)(F(n))2?)
    c = 0 c=0 c=0,那么 T ( n ) = O ( n log ? 2 n ) T(n)=O(n\log_2n) T(n)=O(nlog2?n)

思考三


  • T ( n ) = a T ( n / b ) T(n)=aT(n/b) T(n)=aT(n/b)
  • 思路很简单,就是思考一的延伸。
    递归层数为 log ? b n \log_b n logb?n,每次乘以 a a a ,即:
    T ( n ) = O ( a log ? b n ) = O ( a log ? a n log ? a b ) = O ( n 1 log ? a b ) T(n)=O(a^{\log_bn})=O(a^{\cfrac{\log_an}{\log_ab}})=O(n^{\cfrac{1}{\log_ab}}) T(n)=O(alogb?n)=O(aloga?bloga?n?)=O(nloga?b1?)

思考四

  • 考虑原题目:
    T ( n ) = F ( n ) + a T ( n b ) T(n)=F(n)+aT(\frac{n}{b}) T(n)=F(n)+aT(bn?)
  • 其实就是思考二和思考三的拓展版本。
    在思考二中,我们利用 T 2 ( x ) = T ( log ? 2 n ) T_2(x)=T(\log_2n) T2?(x)=T(log2?n)
    在这里,我们利用 T 2 ( x ) = T ( log ? b n ) T_2(x)=T(\log_bn) T2?(x)=T(logb?n)
  • 然后构造等比数列:
    T 2 ( x ) + F ( b x ) c = a ( T 2 ( x ? 1 ) + F ( b x ? 1 ) c ) 其 中 c 是 常 数 T_2(x)+\frac{F(b^x)}{c} =a(T_2(x-1)+\frac{F(b^{x-1})}{c})\qquad 其中c 是常数 T2?(x)+cF(bx)?=a(T2?(x?1)+cF(bx?1)?)c
    通过移项,我们可以得到:
    a F ( b x ? 1 ) ? F ( b x ) c = F ( b x ) \frac{aF(b^{x-1})-F(b^x)}{c}=F(b^x) caF(bx?1)?F(bx)?=F(bx)

    c = a F ( b x ? 1 ) ? F ( b x ) F ( b x ) c=\frac{aF(b^{x-1})-F(b^x)}{F(b^x)} c=F(bx)aF(bx?1)?F(bx)?
    然后继续构造等比数列:
    T 2 ( x ) + F ( b x ) / c T 2 ( x ? 1 ) + F ( b x ? 1 ) / c = a \frac{T_2(x)+F(b^x)/c}{T_2(x-1)+F(b^{x-1})/c}=a T2?(x?1)+F(bx?1)/cT2?(x)+F(bx)/c?=a

c ≠ 0 c\ne 0 c?=0

  • S ( x ) = T 2 ( x ) + F ( b x ) / c S(x)=T_2(x)+F(b^x)/c S(x)=T2?(x)+F(bx)/c,边界条件 S ( 1 ) = T 2 ( 1 ) + F ( b ) / c = f ( 1 ) S(1)=T_2(1)+F(b)/c=f(1) S(1)=T2?(1)+F(b)/c=f(1)
    我们得到:
    S ( x ) = T 2 ( x ) + F ( b x ) / c = a x ? 1 × f ( 1 ) S(x)=T_2(x)+F(b^x)/c=a^{x-1} \times f(1) S(x)=T2?(x)+F(bx)/c=ax?1×f(1)

    T 2 ( x ) = a x ? 1 × f ( 1 ) ? F ( b x ) / c T_2(x)=a^{x-1}\times f(1)-F(b^x)/c T2?(x)=ax?1×f(1)?F(bx)/c

    T ( n ) = O ( a log ? b n × f ( 1 ) + ( F ( n ) ) 2 F ( n ) ? a F ( n / b ) ) = O ( n 1 log ? a b × f ( 1 ) + ( F ( n ) ) 2 F ( n ) ? a F ( n / b ) ) \begin{aligned} T(n)&=O\Big( a^{\log_b n} \times f(1)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big)\\ &=O\Big( n^{\cfrac{1}{\log_ab}}\times f(1)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big) \end{aligned} T(n)?=O(alogb?n×f(1)+F(n)?aF(n/b)(F(n))2?)=O(nloga?b1?×f(1)+F(n)?aF(n/b)(F(n))2?)?

c = 0 c=0 c=0

  • a F ( b x ? 1 ) = F ( b x ) aF(b^{x-1})=F(b^x) aF(bx?1)=F(bx),即 F ( b x ) = a x F ( 1 ) F(b^x)=a^{x}F(1) F(bx)=axF(1),我们得到:
    T 2 ( x ) = a x F ( 1 ) + a T 2 ( x ? 1 ) T_2(x)=a^xF(1)+aT_2(x-1) T2?(x)=axF(1)+aT2?(x?1)
    特征方程为 λ 2 ? a λ = 0 \lambda^2-a\lambda=0 λ2?aλ=0,特征根为 λ 1 = 0 , λ 2 = a \lambda_1=0,\lambda_2=a λ1?=0,λ2?=a
    设特征方程为 T 2 ( x ) = c 1 a x + c 2 x a x T_2(x)=c_1a^x+c_2xa^x T2?(x)=c1?ax+c2?xax,带入特解 T 2 ( 0 ) = 0 , T 2 ( 1 ) = a F ( 1 ) T_2(0)=0,T_2(1)=aF(1) T2?(0)=0,T2?(1)=aF(1)
    得到: c 1 = 0 , c 2 = F ( 1 ) c_1=0,c_2=F(1) c1?=0,c2?=F(1)
  • 所以:
    T 2 ( x ) = F ( 1 ) a x x T_2(x)=F(1)a^xx T2?(x)=F(1)axx
    即:
    T ( n ) = O ( F ( 1 ) a l o g b n log ? b n ) = O ( F ( 1 ) n 1 log ? a b log ? b n ) T(n)=O(F(1)a^{log_bn}\log_bn)=O(F(1)n^{\frac{1}{\log_ab}}\log_bn) T(n)=O(F(1)alogb?nlogb?n)=O(F(1)nloga?b1?logb?n)

综上

  • 首先要求 F ( n ) F(n) F(n) 是多项式函数。这样就有常数 c c c
    c = a F ( n / b ) ? F ( n ) F ( n ) c=\frac{aF(n/b)-F(n)}{F(n)} c=F(n)aF(n/b)?F(n)?
  • c ≠ 0 c\ne 0 c?=0,则
    T ( n ) = O ( n 1 log ? a b × ( O ( 1 ) + F ( b ) / c ) + ( F ( n ) ) 2 F ( n ) ? a F ( n / b ) ) \begin{aligned} T(n)&=O\Big( n^{\cfrac{1}{\log_ab}}\times (O(1)+F(b)/c)+\frac{(F(n))^2}{F(n)-aF(n/b)}\Big) \end{aligned} T(n)?=O(nloga?b1?×(O(1)+F(b)/c)+F(n)?aF(n/b)(F(n))2?)?
    c = 0 c=0 c=0,则
    T ( n ) = O ( F ( 1 ) n 1 log ? a b log ? b n ) T(n)=O(F(1)n^{\frac{1}{\log_ab}}\log_bn) T(n)=O(F(1)nloga?b1?logb?n)

参考算法

  • 分治复杂度: T ( n ) = O ( n ) + 2 T ( n / 2 ) = O ( n log ? n ) T(n)=O(n)+2T(n/2)=O(n\log n) T(n)=O(n)+2T(n/2)=O(nlogn)
  • 求第K大元素: T ( n ) = 2 T ( n / 2 ) = O ( n ) T(n)=2T(n/2)=O(n) T(n)=2T(n/2)=O(n)

参考书籍


  1. 《算法导论》(Introduction to Algorithms) ??

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:43:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:55:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码