算法_5:算法基础

循环不变式

  • 初始化
  • 保持
  • 终止

分析算法

//插入排序……………………代价……………… 次数
for j=2 to A.length………..c1………………..n
key=A[j]……………………..c2……………….n-1
i=j-1……………………………c4……………….n-1

while i>0 and A[i]>key….c5…………….. nj=2tj
A[i+1]=A[i]………………….c6…………… nj=2(tj1)
i=i-1……………………………..c7………….. nj=2(tj1)
A[i+1]=key……………………….c8……………n-1

T(n)=c1n+c2(n)+c4(n1)+c5nj=2tj+c6nj=2(tj1)+c7nj=2(tj1)+c8(n1)

  • 最佳情况
    T(n)=c1n+c2(n1)+c4(n1)+c5(n1)+c8(n1)=(c1+c2+c4+c5+c8)n(c2+c4+c5+c8)

  • 最差情况
    二次函数

增长的量级

算法设计

增量方法

  • 插入排序,增量方法,对于A[1….j-1]后,将单个元素A[j]插入,生成A[j]

分治法

  • 分治模式
分解:原问题分解为子问题,这些子问题是原问题的规模较小的实例
解决:解决子问题
合并:子问题合并为原问题的解

归并排序

  • 合并子程序,复杂度: O(n), n=r-q+1

    //MERGE(A,p,q,r):子数组A[p…q]和A[q+1…r]
    n1=q-p+1
    n2=r-q
    let L[1…n1+1] 和 R[1…n2+1]为新的数组
    for i= 1 to n1
    ………L[i]=A[p+i-1]
    for i=1 to n2
    ……..R[j]=A[q+j]
    L[n1+1]=
    R[n2+1]=
    i=1
    j=1
    for k=p to r
    ……if L[i]<=R[j]
    ……….A[k]=L[i]
    ……….i=i+1
    ……else A[k]=R[j]
    ………..j=j+1

  • MERGE:归并排序: 分解成两个数组,个数是, n/2 n/2
    MERGE-SORT(A, p, r )
    if p < r
    ……..q= (p+r)/2
    ……..MERGER-SORT(A, p, q)
    ……..MERGER-SORT(A,q+1,r)
    ……..MERGE(A, p, q, r)

分治算法分析

  • 原问题,分解为a个子问题,每个子问题是原问题的1\b, 如果分解为子问题需要时间D(n), 合并子问题需要时间C(n)

    T(n)={O(1)................n<=caT(n/b)+D(n)+C(n)......

  • 归并排序

    T(n)={c................n=12T(n/2)+O(n)......n>1

  • 递归树求解:cn lgn + cn
    2ic=cn=>i=lgn
    因为:lg1=0
    所以:lgn+1

函数的增长

你可能感兴趣的:(算法_5:算法基础)