证明算法复杂度下界---决策树基础篇

6 篇文章 0 订阅
1 篇文章 0 订阅

几个约定

基于易用性与通用性的考虑我们约定:

  1. 任一可能的输入中,不会出现等价元素
  2. 算法复杂度的结果是平滑的
  3. 输入规模应为 k n k^n kn(k的取值应使得计算尽量方便)
  4. l o g ( n ! ) = Θ ( n l o g n ) log(n!)=\Theta (nlogn) log(n!)=Θ(nlogn)(可以由Stiring公式证明)

需要用到的公式

A n m = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . . . . ∗ ( n − m + 1 ) \mathrm{A}_{n}^m=n*(n-1)*(n-2)*......*(n-m+1) Anm=n(n1)(n2)......(nm+1)
C n m = A n m m ! = n ! m ! ( n − m ) ! \mathrm{C}_{n}^m=\frac {\mathrm{A}_{n}^m}{m!}=\frac{n!}{m!(n-m)!} Cnm=m!Anm=m!(nm)!n!

什么是决策树

  1. 树节点,通常以a1:a2的形式表示,表意为关键操作,例如小于大于等于是否在N集合内部等等
  2. 分支:即关键操作给出的决定结果
  3. 叶节点:算法最终输出的所有可能结果

利用决策树证明比较排序的下界

  1. 任何基于比较的排序都可以用决策树T建模
  2. 对于一个特定的算法A ⇒ \Rightarrow 一棵特定的树T
    1. 每一个特定的输入 ⇒ \Rightarrow 特定树T上的一条路径
    2. W(n)即对应树的高度
  3. 比较排序下界即是所有树的最小高度
  4. 而一个正确的算法,其叶子节点的个数设为L,则L满足: n ! ≤ L ≤ 2 h ⇒ h ≥ l o g n ! ∈ Ω ( n l o g n ) n!\le L\le2^h\Rightarrow h\ge logn!\in \Omega (nlogn) n!L2hhlogn!Ω(nlogn)
  5. 则比较排序的下界即 n l o g n nlogn nlogn

利用决策树证明Ksorted的下界

题目说明:

所谓Ksorted就是将数组划分为K个, ∀ j > i \forall j>i j>i,第j个组的每个元素比第i个组的元素都大,证明它的下界是 Ω ( n l o g k ) \Omega(nlogk) Ω(nlogk).

解题思路:

有了比较排序下界的证明思路,我们知道由于二叉树性质 L ≤ 2 h L\le 2^h L2h总成立,所以问题转化为要找最少有多少个叶子节点,也就是将n个元素有序的放在k个组中有多少组合。

答案:

  1. 任何基于比较的Ksorted都可以用决策树T建模

  2. 对于一个特定的算法A ⇒ \Rightarrow 一棵特定的树T

    1. 每一个特定的输入 ⇒ \Rightarrow 特定树T上的一条路径
    2. W(n)即对应树的高度
  3. Ksorted下界即是所有树的最小高度

  4. 而叶子节点对应于所有可能的输出组合,问题转换为n个元素有序的放在k个组中有多少组合。

    C n n k ∗ C n − n k n k ∗ . . . ∗ C n k n k ≥ n ! ( ( n k ) ! ) k \mathrm{C}_n^{\frac{n}{k}}*\mathrm{C}_{n-\frac{n}{k}}^{\frac{n}{k}}*...*\mathrm{C}_{\frac{n}{k}}^{\frac{n}{k}}\ge \frac{n!}{((\frac{n}{k})!)^k} CnknCnknkn...Cknkn((kn)!)kn!

  5. 而一个正确的算法,其叶子节点的个数设为L,则L满足(用约定4):

    n ! ( ( n k ) ! ) k ≤ L ≤ 2 h ⇒ h ∈ Ω ( n l o g k ) \frac{n!}{((\frac{n}{k})!)^k}\le L\le2^h\Rightarrow h\in \Omega (nlogk) ((kn)!)kn!L2hhΩ(nlogk)

  6. 则Ksorted的下界即 n l o g n nlogn nlogn

利用决策树证明螺丝螺母问题下界

题目说明:

有一堆螺丝和一堆螺母,用肉眼无法辨别大小,螺丝只能靠螺母测大小,螺母亦然,请将它们一一配对

解题思路:

此题可以转化为螺丝的排序问题,但要注意的是,此题决策树的状态发生了改变,不再是二叉树,而是三叉树,多了一个“=”的decision

答案:

  1. 由于将螺丝排好序后,螺母也将随之有序,所以将问题转化为螺丝排序问题
  2. 使用决策树对该问题建模,定义关键操作为’对特定螺母,螺丝比他大还是小或者正好匹配?’
  3. 由于三叉树的特性,我们有 L ≤ 3 h L\le3^h L3h
  4. 而输出的排列组合为n!,于是我们有 n ! ≤ L ≤ 3 h ⇒ h ≥ l o g n ! ⇒ h ∈ Ω ( n l o g n ) n!\le L\le 3^h\Rightarrow h\ge logn!\Rightarrow h\in \Omega(nlogn) n!L3hhlogn!hΩ(nlogn)
  5. 所以该问题下界为 n l o g n nlogn nlogn
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
渐近复杂度(big-Θ)是一种用于描述算法运行时间或空间复杂度的记号。它表示算法在最坏情况下的上界和下界,即它给出了算法的上限和下限。 假设有一个函数 f(n),其中 n 是输入大小。如果存在两个正常数 c1 和 c2,以及一个正整数 n0,使得对于大于等于 n0 的所有 n,都有 c1*g(n) ≤ f(n) ≤ c2*g(n),其中 g(n) 是另一个函数。那么我们可以说 f(n) 的渐近复杂度为 Θ(g(n))。 简而言之,渐近复杂度描述了算法的运行时间或空间需求与输入大小的关系。渐近复杂度大致分为三种情况:最好情况、平均情况和最坏情况。最好情况表示在最理想的输入情况下算法的运行时间;平均情况表示在平均输入情况下算法的运行时间;最坏情况表示在最糟糕的输入情况下算法的运行时间。 常见的渐近复杂度包括: - 常数复杂度(O(1)):算法的运行时间不随输入大小而变化。 - 线性复杂度(O(n)):算法的运行时间与输入大小成线性关系。 - 对数复杂度(O(log n)):算法的运行时间与输入大小的对数关系。 - 线性对数复杂度(O(n log n)):算法的运行时间与输入大小的对数关系乘以线性因子。 - 平方复杂度(O(n^2)):算法的运行时间与输入大小的平方成正比。 - 指数复杂度(O(2^n)):算法的运行时间与输入大小的指数关系。 渐近复杂度分析可以帮助我们评估算法的效率和可行性,并选择适合问题规模的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值