算法的时间复杂度和空间负责度、最坏情况和平均情况

来源:互联网 发布:linux系统管理员薪水 编辑:程序博客网 时间:2024/06/08 05:17


解决问题的效率与空间利用率,时间利用率,算法效率都有关系。

算法(Algorithm)是什么呢?

  • 输入——接受一些输入或无输入
  • 输出——产生输出
  • 确定性——每条指令必须明确无歧义
  • 能行性——每条指令都可以执行,一个有限的指令集
  • 有穷性——执行一定步骤后终止

此外,衡量一个算法的性能主要有四个指标:正确性,简明性,健壮性,效率。

一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

(1). 算法采用的策略、方法;

(2). 编译产生的代码质量;

(3). 问题的输入规模;

4). 机器执行指令的速度。

     一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。

 

时间复杂度T(n):耗费时间的长度

 

渐进时间复杂度定义:设f(n)和g(n)是定义在正整数上的正函数,如果存在两个证常数c和n0使得c>=n0时,有f(n)<=cg(n),则记作f(n)=O(g(n))。渐进时间复杂度简称为时间复杂度,大O几号用来表达一个算法运行时间的上界。当我们说一个算法具有O(g(n))的运行时间时,是指该算法在计算机上的运行时间不会超过g(n)的某个常数倍。

 

推导大O阶:

  • l  用常数1取代运行时间中的所有加法常数
  • l  在修改后的运行次数函数中,只保留最高阶项。
  • l  如果最高阶项存在不是1的常数,则去掉这个常数。

得到的结果就是大O阶。

常见的有常数阶O(1),线性阶O(n),对数阶O(logn),平方阶O(n2),而指数阶O(2n)和阶乘阶O(n!)都是不切实际的。

常见的时间复杂度排序如下:

O(1)< O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<…<O(2n)<O(n!)

 

最坏情况运行时间是一种保障,就是运行时间不会再坏了,通常除非特别指定,我们提到的运行时间都是最坏情况时间复杂度。而平均运行时间是所有情况中最有意义的,它是期望的运行时间。

 

空间复杂度:占用存储单元的长度。

空间复杂度包含两个部分:

l  固定部分:与处理数据的大小和个数无关,或说与问题的实例特征无关,主要包括程序代码、常量、简单变量、定长结构变量。

l  可变部分:与算法执行处理的数据大小和规模有关,包括数据元素所占空间,以及算法执行所需的额外空间。

若算法执行时所需的辅助空间相对于输入变量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。

 

常用排序算法的时间复杂度如下:

复杂度分析:

  • T1(n)+T2(n)=max{O1(),O2() }
  • T1(n)*T2(n)=O(f1(n)*f2(n))
  • T(n)为关于n的k阶多项式,那么T(n)=O(nk)
  • For循环复杂度等于循环次数乘以循环体的复杂度
  • If-else:两个分支中最大的

降低算法复杂度:分而治之

0 0
原创粉丝点击