zoukankan      html  css  js  c++  java
  • 第二章 分治算法 上

    分治算法的原理

    设计过程:

    Divide:整个问题划分为多个子问题——分解

    Conquer:求解各个子问题(递归调用子问题的算法)——求解

    Combine:合并子问题的解,形成原始问题的解。——合并

    分析过程:

    1、建立递归方程:

      T(n)=aT(n/b)+D(n)+C(n)

        Divide时间复杂度:D(n)

        Conquer时间复杂度:aT(n/b)

        Combine:C(n)

      当n<c,T(n)=θ(1)

    2、递归方程求解:

    归并算法:

    找最大值:

     

    折半搜索:

    最坏情况:T(n)=T(n/2)+O(1)

    大整数乘法

     

                                   =AC2^n+AD2^(n/2)+BC*2^(n/2)+BD

                                   分解成了四个规模是n/2的子问题4T(n/2)

                                  AC2^n——2n的规模的数字

                                  AD2^(n/2)——(3/2n)的规模的数字

                                  BC2^(n/2)——(3/2n)的规模的数字

                                  BD——n规模的数字

    上述四项相加的复杂度为O(6n)

    所以

    利用master定理可以计算时间复杂度为O(n^2)

    由于通用算法的时间复杂度为O(n^2),所以此算法并没有改善时间复杂度。

    下面换一种算法:

                          1、分解成了三个规模是n/2的乘法

                          2、合并代价依旧是O(n)

    快速排序:

    最好情况T(n)=2T(n/2)+O(n)

    最坏情况T(n)=T(1)+T(n-1)+O(n)

    基于比较排序方法最好的算法不会好于O(nlogn)

    因为比较搜索树中2^h>=n!,从而h>=nlogn

    第k小的元素

    在有n个元素的数组中找第k小的元素

    Select (S,k)

    if |S|<50,排序输出第k小,return.

    S划分5个元素一组,每小组取出中位数。

    将中位数放入数组M中,有n/5个

    X=Select(M,|M|/2)——找中位数的中位数

    A是S中比X小的元素

    B是S中与X相等的元素

    C是S中大于X的元素

    if|A|>=k :select(A,k)

    elseif |A|+|B|>=k  X

    else:select(C,k-|A|-|B|)

     

  • 相关阅读:
    Aspx后台遍历控件
    sql server 压缩日志文件
    C# 获取特殊日期
    sql特殊日期
    Oracle数据库基本知识-原理,实例,表空间,用户,表
    使用Visual Studio Code开发.NET Core看这篇就够了
    Windows上C++环境搭建
    JNA 教程
    SpringBoot项目改成Tomcat容器加载(打war包)
    centos7 离线安装神器yumdownloader
  • 原文地址:https://www.cnblogs.com/chy8/p/9664221.html
Copyright © 2011-2022 走看看