算法的时间复杂度定义为:

时间复杂度或称时间复杂性,又称计算复杂度,她说是算法有效的度量之一,时间复杂度是一个算法运行时间的相对度量,一个算法的运行时间长短,它大致等于执行一种简单操作所(赋值、比较、计算、转向、返回、输入和输出)需要的时间与算法中进行简单操作次数的乘积。

根据定义,求解算法的时间复杂度的具体步骤是:

⑴   找出算法中的基本语句;
  一般算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

⑵  计算基本语句的执行次数的数量级;
  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

⑶  用大Ο记号表示算法的时间性能。
  当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。

简单的说,就是保留求出次数的最高次幂,并且把系数去掉。  如T(n)=2n^2+n+1=O(n^2)

举个例子:

#include "stdio.h"
int main()
{  int i, j, x = 0, sum = 0, n = 100;  /* 执行1次 */  for( i = 1; i <= n; i++)    /* 执行n+1次 */  {  sum = sum + i;               /* 执行n次 */     for( j = 1; j <= n; j++)    /* 执行n*(n+1)次 */  {  x++;                /* 执行n*n次 */  sum = sum + x;      /* 执行n*n次 */  }  }  printf("%d", sum);          /* 执行1次 */
}  

照上面推导“大O阶”的步骤,我们来看

第一步:“用常数 1 取代运行时间中的所有加法常数”,

则上面的算式变为:执行总次数 =3n^2 + 3n + 1

(直接相加的话,应该是T(n) = 1 + n+1 + n +n*(n+1) + n*n + n*n + 1 = 3n^2 + 3n + 3。现在用常数 1 取代运行时间中的所有加法常数,就是把T(n) =3n^2 + 3n + 3中的最后一个3改为1. 就得到了 T(n) = 3n^2 + 3n + 1)

第二步:“在修改后的运行次数函数中,只保留最高阶项”。

这里的最高阶是 n 的二次方,所以算式变为:执行总次数 = 3n^2

第三步:“如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数”。

这里 n 的二次方不是 1 所以要去除这个项的相乘常数,算式变为:执行总次数 = n^2
因此最后我们得到上面那段代码的算法时间复杂度表示为: O( n^2 )

下面我把常见的算法时间复杂度以及他们在效率上的高低顺序记录在这里,使大家对算法的效率有个直观的认识。

O(1) 常数阶 < O(logn) 对数阶 < O(n) 线性阶 < O(nlogn) < O(n^2) 平方阶 < O(n^3) < { O(2^n) < O(n!) <O(n^n) }

最后三项用大括号把他们括起来是想要告诉大家,如果日后大家设计的算法推导出的“大O阶”是大括号中的这几位,那么趁早放弃这个算法,在去研究新的算法出来吧。因为大括号中的这几位即便是在 n 的规模比较小的情况下仍然要耗费大量的时间,算法的时间复杂度大的离谱,基本上就是“不可用状态。

好了,原理就介绍到这里了。下面通过几个例子具体分析下时间复杂度计算过程。
一、计算 1 + 2 + 3 + 4 + ...... + 100。
常规代码:
#include "stdio.h"
int main()
{  int i, sum = 0, n = 100;    /* 执行1次 */  for( i = 1; i <= n; i++) /* 执行 n+1 次 */  {  sum = sum + i;          /* 执行n次 */  //printf("%d \n", sum);  }  printf("%d", sum);          /* 执行1次 */
}
从代码附加的注释可以看到所有代码都执行了多少次。那么这写代码语句执行次数的总和就可以理解为是该算法计算出结果所需要的时间。该算法所用的时间(算法语句执行的总次数)为: 1 + ( n + 1 ) + n + 1 = 2n + 3

而当 n 不断增大,比如我们这次所要计算的不是 1 + 2 + 3 + 4 +...... + 100 = ? 而是 1 + 2 + 3 + 4 + ...... + n = ?其中 n 是一个十分大的数字,那么由此可见,上述算法的执行总次数(所需时间)会随着 n 的增大而增加,但是在 for 循环以外的语句并不受n 的规模影响(永远都只执行一次)。所以我们可以将上述算法的执行总次数简单的记做: 2n 或者简记 n

这样我们就得到了我们设计的算法的时间复杂度,我们把它记作: O(n)。

高斯算法:
#include "stdio.h"
int main()
{  int sum = 0, n = 100;   /* 执行1次 */  sum = (1 + n) * n/2;    /* 执行1次 */  
   printf("%d", sum);      /* 执行1次 */
}

这个算法的时间复杂度:
O(3),但一般记作 O(1)。
从感官上我们就不难看出,从算法的效率上看,O(1) < O(n)
的,所以高斯的算法更快,更优秀。
二、求两个n阶方阵C=A*B的乘积其算法如下:
//右边列为语句执行的频度
void MatrixMultiply(int A[n][n],int B [n][n],int C[n][n])
{     for(int i=0; i <n; i++)                       //n+1  {  for (j=0;j < n; j++)                       //n*(n+1)  {  C[i][j]=0;                                  //n^2  for (k=0; k<n; k++)                 //n^2*(n+1)  {  C[i][j]=C[i][j]+A[i][k]*B[k][j]; //n^3  }  }  }
}

则该算法所有语句的频度之和为:
T(n) = 2n^3+3n^2+2n+1;  利用大O表示法,该算法的时间复杂度为O(n^3)。

三、分析下列时间复杂度

void test_(int n)
{i = 1, k = 100;  while (i<n)  {  k = k + 1;  i += 2;  }
}

设for循环语句执行次数为T(n),则 i = 2T(n) + 1 <= n - 1,  即T(n) <= n/2 - 1 = O(n)

四、分析下列时间复杂度

void test_2(int b[], int n)
{  int i, j, k;  for (i=0; i<n-1; i++)  {  k = i;  for (j=i+1; j<n; j++)  {  if (b[k] > b[j])  {  k = j;  }  }  x = b[i];  b[i] = b[k];  b[k] = x;  }
}

其中,算法的基本运算语句是

if (b[k] > b[j])

{

k = j;

}

其执行次数T(n)为:

五、分析下列时间复杂度

void test_3(int n)
{  int i = 0, s = 0;  while (s<n)  {  i++;  s = s + i;  }
}

其中,算法的基本运算语句即while循环内部分,

设while循环语句执行次数为T(n),则

六、Hanoi(递归算法)时间复杂度分析

    void hanoi(int n, char a, char b, char c)  {  if (n==1)  {  printf("move %d disk from %c to %c \n", n, a, c);  //执行一次  }  else  {  hanoi(n-1, a, c, b);    //递归n-1次  printf("move %d disk from %c to %c \n", n, a, c);  //执行一次  hanoi(n-1, b, a, c);    //递归n-1次  }  }

对于递归函数的分析,跟设计递归函数一样,要先考虑基情况(比如hanoi中n==1时候),这样把一个大问题划分为多个子问题的求解。

故此上述算法的时间复杂度的递归关系如下:

大二学习需努力阿。

就扯到这里,希望对大家有所帮助。

数据结构中的时间复杂度的计算相关推荐

  1. 数据结构中常见的时间复杂度分析题目

    数据结构中常见的时间复杂度分析题目 时间复杂度基本概念 例如上面的代码,我们可以表示成T(n) = O(f(n)),而f(n) = 2n + 3.我们使用大O表示法可以写为T(n) = O(n). 分 ...

  2. [数据结构]数据结构中各种树

    阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树 数据结构中有很多树的结构 ...

  3. 数据结构中的原子、分子和物质

    <数据结构中的原子.分子和物质>源站链接,阅读体验更佳~ 学习数据结构和算法是写出高效率代码的必由之路,在实际的工作中,我们可能不会亲自去造轮子,比如实现一个排序算法,实现一个红黑树,因为 ...

  4. <<数据结构中最全的8种排序算法总结>>

    数据结构中最全的8种排序算法总结 1.插入排序 代码如下: 2.希尔排序 代码如下: 3.选择排序 代码如下: 4.堆排序 代码如下: 5.冒泡排序 代码如下: 6.快速排序 代码如下: 7.归并排序 ...

  5. 数据结构中常见的各种树原理详解(学习笔记)

    文章目录 01.回顾 1.树 02.二叉树 3.堆 堆排序 优先队列 索引优先队列 3.二叉搜索树(二叉查找树) 4.二叉平衡树(ALV) 02. 2-3查找树 2-3树的性质 03.红黑树 红黑树插 ...

  6. 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  7. 数据结构——数据结构中的数据表示

    1,本文介绍数据的概念,以便讨论数据结构究竟是什么: 2,程序设计的挑战: 1,利用计算机解决现实生活中的问题: 1,计算机顾名思义是其诞生的时候仅仅是给科学家使用,科学家用计算机进行计算: 2,这是 ...

  8. 初始化栈的代码_数据结构中的栈,你知道多少?

    由于栈比较简单,也很容易理解,学过的人都知道一句话就可以描述栈的特性:后进先出.所以这篇文章主要是写如何使用代码来描述栈,当然也是让大家很容易理解的语言.还是先给出这篇文章的大致脉络. 首先,对栈有一 ...

  9. 数据结构中的各种排序---总结篇

    转载:http://blog.csdn.net/wzyhb123456789/article/details/5974790 一个月没有写文章,原因是一直在忙碌着,但是其实是有收获的,下面就是我这前半 ...

  10. 数据结构中基本查找算法总结

    原文地址:https://www.cnblogs.com/xuzhp/p/4638937.html 基本查找算法    一.查找的基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素 ...

最新文章

  1. 【每日一算法】整数反转
  2. JavaScript语言特点
  3. 程序员必看 c++笔试题汇总
  4. vlc windows 编译文档
  5. 如何使用ADLab搭建活动目录实验环境来练习渗透测试技术
  6. [渝粤教育] 西南科技大学 机械控制工程基础在线考试复习资料
  7. 查看一个定义的方法在哪些地方被使用过(vs2008)
  8. Vue-router学习(一)- 路由匹配
  9. Android——selector背景选择器的使用详解(二)
  10. JavaScript运动应用一
  11. VTK(二)---相机外参矩阵Tcw转VTK相机,构建VR虚拟相机
  12. Java引用多个jar包的写法
  13. 清华大学马少平:一款智能硬件背后的“AI争霸”...
  14. 网络抖动、丢音、卡顿
  15. 创建物理卷报错Can‘t open /dev/sdb1 exclusively. Mounted filesystem?以及对应的解决方法
  16. 计算机英语口语面试自我介绍,面试英文口语自我介绍(精选8篇)
  17. C——识别键盘按下模拟键盘按下
  18. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(下)
  19. 静雅学校有高中吗有计算机,涿州靖雅中学
  20. 超棒的电烙铁的焊接方法图解

热门文章

  1. 这可能是最简单易懂的机器学习入门(小白必读)
  2. Pure Pursuit轨迹跟踪matlab程序
  3. 杰理AC692X系列---关于692x及693x的打开在线调EQ功能(4)
  4. matlab求t分布的p值,在R中如何求给定分布和统计量的p-value
  5. Findbugs错误总结
  6. 底量超顶量超级大黑马指标源码_通达信绝密三代指标,秒杀一切妖股指标公式源码...
  7. 致敬!百里煤海战斗在第二战线上的人们
  8. wps演示怎么提高列表级别_wps文字如何设置标题级别?wps设置标题级别教程
  9. 道路交通安全隐患排查的方法研究
  10. MySQL基础回顾(七):数据查询语言DQL---select查询语句总结(篇二)