美文网首页
4.4python算法复杂度和渐进复杂度

4.4python算法复杂度和渐进复杂度

作者: 13351 | 来源:发表于2019-04-04 13:30 被阅读0次

对于递归算法例如求阶乘,他们就会呈现出一种线性复杂度

def fact(n):
  if n==1:
      return 1
  else:
     return n*fact(n-1)

上面的算法复杂度就达到了O(n)

对数线性复杂度

很多对数线性复杂度的方法都是归并排序一类

多项式复杂度

有算法随着n的次幂增长

平方级复杂度

复杂度

在这个算法当中出现了两种复杂度,所以我们要舍弃其中一个较小的复杂度,也就是后项的复杂度,进而采用前项的平方复杂度

指数算法

典型例子就是递归算法
比如汉诺塔问题用递归算法来描述仅需要两步就可以完成,但是很不幸的,很多重要的问题恰恰是指数复杂度的,这样的代价非常高昂

def genSubsets(L):
  res=[]
  if len(L)==0:
      return [[]]
  smaller=genSubsets(L[:-1])
  extra=L[-1:]
  new1=[]
  for small in smaller:
      new1.append(small+extra)
  return smaller+new1

首先假设append是常数时间,时间是多少

我们到现在已经看过了一系列的复杂度表示,越往下走算法越复杂,之后会看到的这些复杂度的例子

L9P4

每次将问题一分为二的算法也就是对数复杂度的经典算法,例如我们常见的二分法求平方根的算法就是经典的对数复杂度算法

一个典型的值得思考的问题

我们组织了一场国际象棋巡回赛,参赛人员有n人,(不考虑平局和认输)你该怎么表示为了决胜所需要的比赛次数?

这个问题刚看上去好像是对数复杂度的问题:因为只要把所有的人两两配对进行比赛,如果还假定每次比赛时间是固定的,那么比赛的次数就会比现行地比赛少特别多。

总结一下几种复杂度及其特点

常数复杂度:不随问题规模和输入大小而改变的复杂度
对数复杂度:常见的对数复杂度例如二分查找以及序列索引,随着问题规模增大而增大

相关文章

网友评论

      本文标题:4.4python算法复杂度和渐进复杂度

      本文链接:https://www.haomeiwen.com/subject/uyyfiqtx.html