高级算法 应用主项定理Master Method 求时间复杂度 判断有向图是否有环

逻辑结构指的是:数据元素之间的逻辑结构,并非是数据元素的内部数据项之间的关系


如果数据元素保持一致,那么查找时可以使用折半查找是错的:原因是:这跟数据的存储方式有关,如果是链式存储,那么不能采用折半查找,必须是有序的顺序表才可以进行折半查找


int foo( int n){
     if (n <=  1 )
         return 1 ;
     return n * foo(n -  1 );
}

上面的程序的时间复杂度为 O(n)


一目了然看出来   最好和最坏时间复杂度相同的排序算法是不受初始序列影响的


关于折半查找的一些题目:

while(x<=y) {
        m = x + (y-x)/2; //2
        if(data[m] == v) return m; //3
        else if(data[m] > v) y = m-1; //4
        else x = m+1; //5
    }

补充:这里下标是个坑,记住上限有没有包含就可以对付1,4,5处的问题(熟记理解两个版本的代码区别),然后是2,写成x+(y-x)/2是防止xy都很大的情况下x+y越界。这样的话应对二分查找应该够了


一个算法的基本特征:

有穷性   确切性    输入项       输出项     可行性     正确性    健壮性

一个好的算法的基本特征:

健壮性    无二义性    可读性好的


根据分析递归方程分析算法的时间复杂度

T(n) = a * T(n/b) + f(n) 
³ 1,b > 1,f(n)一般是个简单函数

两种方法来计算时间复杂度:

第一种就是:

一是用递归树,逐层代入原式,最终形成一个级数,然后用一个函数来表达,得到T(n)。

第二种就是:

应用主项定理:主项定理也就是对递归树方法的一种归纳,形成了固定的计算方式,并分三种情形来计算。

这三种情形主要是比较 nlogba 与 f(n),为什么要比较这两个函数呢?

观察原式,可以看出,nlogba其实相当于用递归树方法解出的递归方程的右侧的第一项,
而f(n)则是递归方程的右侧的第二项,这样,主项定理实际上是在比较组成结果的两个函数项,
而且这种比较是按照数量级(或者说是变化幅度)来比较的,也就是说,如2n 与 28n是
数量级(变化幅度)相当的。


这样有三种情况:

  1. f(n) < nlogba                

    也就是 f(n) = O(nlogba - e ) ,e > 0为任意小的常数
    或者说,f(n) 比 nlogba变化的慢,慢ne 
    那么,T(n) Î Q (nlogba)

  2. f(n) > nlogba          

    也就是 f(n) = W(nlogba +e ) ,e > 0为任意小的常数
    或者说,f(n) 比 nlogba变化的快,快ne 
    那么, T(n) Î Q(f(n))

    可以简单地说,递归方程的右侧的两项,哪项变化的块,T(n)就属于哪项的数量级

  3. f(n) = nlogba

    也就是两项的数量级相当,就给这个数量级乘上一个lg n 

    T(n) Î Q(nlogba * lg n)

判断有向图是否有环的方法:

深度优先遍历:如果一个顶点被访问了两次    说明有向图中有环

拓扑排序:用于判断是否有环的方法


常用算法的比较:

排序方法     比较次数       移动次数     稳定性   辅助空间
                   最好    最差    最好  最差                   最好   最差
冒泡排序     n        n^2        0      n^2        是          1          1
快速排序 nlogn    n^2     logn      n          否        logn       n
堆排序     nlogn  nlogn    nlogn  nlogn     否           1         1


对于基本有序的排序算法   冒泡排序算法的时间复杂度最好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值