【MIT 公开课】Computer Science and Programing Lession 8

来源:互联网 发布:那个房产软件好 编辑:程序博客网 时间:2024/05/17 06:51

第八节课主要讲的是算法的复杂度问题:

一.求a^b:

1.

def exp1(a,b):   ans = 1   while (b>0):     ans *= a     b -= 1   return ans


T(b)=3b+2

O(b) 线性复杂度


2.

def exp2(a,b):  if b == 1:    return a  else: return a*exp2(a,b-1)

递归法:

T(b)=3+T(b-1)

      =3*k+T(b-k)  当b-k=1时停止

      =3*(b-1)+2

      =3b-1

O(b) 线性复杂度

   3.

def exp3(a,b):  if b == 1:    return a  if (b%2)*2 == b:    return exp3(a*a, b/2)  else: return a*exp3(a,b-1)


   当b为偶数时:T(b)=6+T(b/2)

   当b为奇数时:T(b)=6+T(b-1)=12+T[(b-1)/2]

所以:T(b)=12+12+T(b/2^2)=12*k+T(b/2^k)

当2^k=b时停止,所以k=log2^b

O(logb)对数级复杂度

二.

def g(n):  x = 0  for i in range(n):    for j in range(m):      x += 1  return x

内嵌循环的复杂度

T=n*m

当m=n时,复杂度为O(n^2)

平方级的复杂度

三.

def Towers(size,fromStack,toStack,spareStack):  if size == 1:    print 'Move disk from ',fromStack, 'to ',toStack  else:    Towers(size-1,fromStack,spareStack,toStack)    Towers(1,fromStack,toStack,spareStack)    Towers(size-1,spareStack,toStack,fromStack)

汉诺塔问题

T(n)=1+2T(n-1)+T(1)=3+2T(n-1)=3+2*3+4T(n-2)=3(1+2+4+……+2^(k-1))+2^kT(n-k)

复杂度为O(Z^n)

指数级复杂度

四.从排好序的数组中查找某个元素

1.

def search(s, e):  answer = None  i = 0  numCompares = 0  while i < len(s) and answer == None:    numCompares += 1    if e == s[i]:      answer = True    elif e < s[i]:      answer = False    i += 1  print answer, numCompares

遍历法:O(len(s))线性级复杂度

2.

def bsearch(s, e, first, last):  print first, last  if (last - first) < 2: return s[first] == e or s[last] == e  mid = first + (last - first)/2  if s[mid] == e: return True  if s[mid] > e: return bsearch(s, e, first, mid - 1)  return bsearch(s, e, mid + 1, last)
二分法:复杂度为对数级,每次把规模减小一半。


0 0
原创粉丝点击