时间复杂度的概念

在看Arrays.sort()的源码的时候,看到了一个涉及到时间复杂度的问题,对于我这个渣渣来说,时间复杂度有点陌生,所以就写下来,搞明白,为了以后能够随时去看,这是初衷。

    首先应该是为什么会有时间复杂度这个概念

        算法是用来解决问题的,那么去衡量这个算法的适用性,可靠性的标准之一就是时间复杂度,当某个算法执行的语句明显果多,他的执行时间很显然要更长一点,也就是说,我们可以将使用这个方法去解决这个问题所执行的语句次数成为语句频率或者时间频率T(n),

在上面提到的时间频度T(n)中,n是指算法的规模,n不断的变化,T(n)就会不断的变化,而这些变化的规律是怎样的呢?于是我们引入了时间复杂度的概念。(引用)

        语句的执行次数与算法的耗时是成正比的,也就是算法内执行的语句越多,他的耗时也就越长,

   什么是时间复杂度,算法中某个函数有n次基本操作重复执行,用T(n)表示,现在有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。通俗一点讲,其实所谓的时间复杂度,就是找了一个同样曲线类型的函数f(n)来表示这个算法的在n不断变大时的趋势 。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”(引用)

大O表示时间复杂度,它是一个算法的时间复杂性,大O表示只是说存在上界但并不是上确界。

下面是我看到一个博客的几个对时间复杂度的梨子,感觉从简入深容易理解,所以就搬过来了。

2.简单算法的时间复杂度举例

列举一些简单例子的时间复杂度。

O(1)的算法是一些运算次数为常数的算法。例如:

    temp=a;a=b;b=temp;

上面语句共三条操作,单条操作的频度为1,即使他有成千上万条操作,也只是个较大常数,这一类的时间复杂度为O(1)。

 

O(n)的算法是一些线性算法。例如:

    sum=0;                 

     for(i=0;i<n;i++)       

         sum++;

上面代码中第一行频度1,第二行频度为n,第三行频度为n,所以f(n)=n+n+1=2n+1。所以时间复杂度O(n)。这一类算法中操作次数和n正比线性增长。

 

O(logn) 一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取 O(logn)时间。举个栗子:

    int i=1; 

    while (i<=n) 

       i=i*2; 

上面代码设第三行的频度是f(n),   则:2的f(n)次方<=n;f(n)<=log₂n,取最大值f(n)= log₂n,所以T(n)=O(log₂n ) 。

 

O(n²)(n的k次方的情况)最常见的就是平时的对数组进行排序的各种简单算法都是O(n²),例如直接插入排序的算法。

而像矩阵相乘算法运算则是O(n³)。

举个简单栗子:

    sum=0;                

     for(i=0;i<n;i++)  

        for(j=0;j<n;j++) 

           sum++;

第一行频度1,第二行n,第三行n²,第四行n²,T(n)=2n²+n+1 =O(n²)

 

O(2的n次方) 比如求具有n个元素集合的所有子集的算法 

 

O(n!) 比如求具有N个元素的全排列的算法

 

时间复杂度按n越大算法越复杂来排的话:常数阶O(1)、对数阶O(logn)、线性阶O(n)、线性对数阶O(nlogn)、平方阶O(n²)、立方阶O(n³)、……k次方阶O(n的k次方)、指数阶O(2的n次方)。

 

既然说到了这个复杂排序,就必须再多说几句。我们还需要区分算法最坏情况的行为和期望行为。就比如说快速排序,最坏情况运行时间是 O(n²),但期望时间是O(nlogn)。但是我们只要通过一些手段,可以避免最坏情况发生,所以在实际情况中,精心设计的快速排序都能以期望时间运行。

 

最后再提一下指数的情况。指数算法一般来说太复杂了,所以实际情况下如果不是迫不得已不要用时间复杂度为指数的算法,除非n特别小。

引用出自;https://www.cnblogs.com/huangbw/p/7398418.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值