关闭

数据结构与算法 - 时间复杂度详解

标签: 数据结构
28人阅读 评论(0) 收藏 举报
分类:

时间复杂度详解

我们可以使用著名的高斯定理来解释什么是时间复杂度,时间复杂度的重要性

也就是从小到大我们所熟悉的一个定理 1+2+3+4+5+6+….+100的结果


使用高斯定理我们可以很轻松的算出答案

  • sum = 1 + 2+ 3 + 4 + 5+….+99 + 100

  • sum = 100 + 99+ 98 +97 +96+….+2 + 1

  • sum + sum = 101 +101 +101 + 101 + 101 +…… (共100个)

  • sum = 10100 / 2 = 5050

大家可以看出高斯定理是可以非常迅速的算出答案,我们可以使用程序来计算

我们先用最基础的for循环来计算答案

int sum = 0;

for (int i = 1; i <= 100; i++){
   sum = sum + i;
}
  System.out.println(sum);
}

由程序可知for循环 循环了 100次才算出答案

当我们使用等差数列中的高斯定理来运算时

int n = 100 ;
int sum = (1 + n)*n/2;
System.out.println(sum);

可以看到我们只运算了一次就可以算出答案而最开始的for循环则需要循环100次才能算出答案

接下来我们就可以对时间复杂度来下一个定义了


  • 什么是时间复杂度

  • 时间复杂度是算法的时间量度也就是算法的执行时间
  • 我们定义算法的总执行次数为 T(n) 进而分析随n的变化来确定 T(n)的次数算法的时间复杂度记作为 T(n) = O(f(n))其中 f(n)是关于n的函数,而n则被称为问题规模

我们一般用大写的 O() 来作为时间复杂度的记法

对于时间复杂度是怎么算的下面给出几种比较常见的计算方式与类型

第一种 O(1)

int n = 100 ;//运行一次
int sum = (1 + n)*n/2;//运行一次
System.out.println(sum);//运行一次

上面一共有三次操作 但是每次操作都是单条操作也就是指运行一次不管运行多少次,次数都是一个常数 所以我们都将这种的时间复杂度称为O(1)


第二种 O(n)

for (int i = 1; i <= n; i++){
   sum = sum + i;//运行一次
}

这里的sum = sum+i;是运行了一次的但是for循环是必须要循环n次所以我们将其的时间复杂度称为O(n) ,通常大部分的O(n)算法也被称之为线性算法


第三种 O(logn)

int i=1;

while (i<=n)

   i=i*2;

上面的 i = i*2 运行了一次 但是每次的 i 都是 *2 我们的跳出循环条件 也就是时间运行的结束点是以i<=n来作为结束的,当每次i乘以2的时候也就离n更近了,所以我们可以得出 多少个2 相乘等于n 也就是
2^x = n 也就是log2^n
则得出 时间复杂度为 O(log2n)


第四种O(n^2)

for(int j = 1 ; j<=n ;j++) {
for (int i = 1; i <= n; i++){
   sum = sum + i;//运行一次
}
}

上面的可以看出是有两个for循环,里面的循环我们刚才已经分析过了,为O(n)的时间复杂度,内循环再次循环n次也就是n^2所以这段代码时间复杂度为 O(n^2)


上面四种只是最基本的时间复杂度计算,下面附上一张计算时间复杂度的参考表
这里写图片描述

最后还要说一点就是,我们上面算的都是时间复杂度的最坏情况,完成这段代码的运算最坏情况下需要的时间,应该有的算法情况有着不确定性,有可能是第一次就算出来了也有可以能最后一次也就是第n次才算出,所以我们算的一般都是时间复杂度的最坏情况

0
0
查看评论

数据结构-算法-时间复杂度计算

算法的时间复杂度定义为: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的...
  • hitwhylz
  • hitwhylz
  • 2013-10-07 12:50
  • 9940

数据结构之时间复杂度和空间复杂度

算法复杂度分为时间复杂度和空间复杂度,一个好的算法应该具体执行时间短,所需空间少的特点。      随着计算机硬件和软件的提升,一个算法的执行时间是算不太精确的。只能依据统计方法对算法进行估算。我们抛开硬件和软件的因素,算法的好坏直接影响程序的运行时间。 &...
  • lg_gyh
  • lg_gyh
  • 2016-09-06 18:45
  • 2865

一道关于时间复杂度的数据结构题目

求x++执行的次数for(i=1;in;i++)   for(j=1; ji; j++)       for(k=1; kj; k++)  ...
  • zxglive2006
  • zxglive2006
  • 2007-09-02 10:48
  • 448

数据结构和算法(二)——时间复杂度和空间复杂度

null
  • lovewaterman
  • lovewaterman
  • 2014-07-20 12:12
  • 9037

20150908数据结构(C语言版)算法时间复杂度问题

1, 算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学复习起来无从下手,下面我们就这个问题给各位考生进行分析。 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,...
  • xuemudan
  • xuemudan
  • 2015-09-08 15:59
  • 954

数据结构(一) 时间复杂度

数据结构马上就要考试了,抓紧复习下,听说数据结构对于这一行业来说挺重要的,所以就把复习的历程记录下来,以备后用(顺便装个X)。1.试分析下面各程序段的时间复杂度。(1)x=90; y=100; while(y>0) if(x>100) {x=x-10...
  • zhaiax672
  • zhaiax672
  • 2016-12-04 10:44
  • 790

【数据结构与算法】复杂度度量与分析

【数据结构与算法】复杂度度量与分析1.时间复杂度对算法的计算成本涵盖多个方面,为了确定计算成本的度量标准,我们常常从计算速度这一主要因素入手,如何度量一个算法所需的计算时间?随着输入规模的扩大,算法的执行时间可以表示为输入规模的一个函数,我们称作算法的时间复杂度,特定算法处理规模为n的问题所需的时间...
  • sinat_26908721
  • sinat_26908721
  • 2016-07-26 17:35
  • 849

大话数据结构开篇:时间复杂度和空间复杂度

1. 算法的复杂度: 算法的复杂度分为时间复杂度和空间复杂度,时间复杂度是指衡量算法执行时间的长短;空间复杂度是指衡量算法所需存储空间的大小。 2. 时间复杂度:  2.1 时间频度:一个算法中语句执行次数称为时间频度,计为T(n)。 2.2 时间复杂度:算法的时间复杂度描述的是T(n...
  • zdp072
  • zdp072
  • 2013-10-29 23:23
  • 3648

数据结构与算法系列----Sunday算法详解

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。Sunday算法的思想和BM算法中的坏字符思想非常类似。差别只是在于Sunday算法在失配之后,是取目标串中当前和模式串对应的部分后面一个位置的字符来做坏字符匹配。 如下: 下标数:01234567890 目标串:ab...
  • LaoJiu_
  • LaoJiu_
  • 2016-02-29 19:38
  • 5258

浅谈算法和数据结构:哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是它们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度。 那么有没有查找效率更高的数据结构呢,答案就是本文接下...
  • jiajiayouba
  • jiajiayouba
  • 2015-04-09 15:20
  • 1447
    个人资料
    • 访问:112194次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论