zoukankan      html  css  js  c++  java
  • 算法

    第1章:(大题:推导题)

    1、母函数:相关类型题请看课本11页的

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    1、Huffman树:(课本29页)

    算法设计:

    Huffman树的构造:已知n个字符的权为Pi 其中i=1,2,3……n

    Step1:构造n个带权为Pi 的只有根节点的二元树集。L={T1,T2……Tn}

    Step2:在L中选择权最小的两棵二元树为左右子树组成一棵新的二元树,其权为左右子树的权之和;

    Step3:在L中删除两棵子树,将新树加入树集L;

    Step4:重复Step2、Step3直至L中只含一棵二元树。

    时间复杂性分析:时间复杂度为 T=O(n^2)

    空间复杂性:其空间复杂度为T=O(n+1)。

    2、二分查找(课本33页)

    算法设计:

    READ A(1:n), x

    K←1, m←n

    While k≤ m do

    j←INT[(K+M)/2]

    IF x=A[j] THEN

    EXIT

    IF x<a[j] THEN

    m←j-1

    ELSE

    K←j+1

    END

    IF k>m THEN

    j←0

    OUTPUT j

    时间复杂度分析:最好的情况下为一次查找到查找数据,即x=A[n/2].

    最坏的情况下,设n=2L,则要查找L+1次,即log2n+1次。

    所以,可以得到时间复杂度为:O(log2n)

    空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3.矩阵的链乘:

    算法设计

    READ n, r(1:n+1)

    mij ← 0

    S←0

    for m = n-1 to 1 do

    { for i = 1 to m do

    { for j = S+1 to n do

    { for k = i to j-1 do

    { x(k) = m(i,k)+m(k+1,j)+r(i)r(k+1)r(j+1)

    }

    }

    m(i,j) = min(x(k))

    }

    S←S+1

    }

    If m(i,j)!=0

    {then output i,j}

    时间复杂性分析:因为算法中使用了4个FOR循环,而真正执行时间却是最内层的一个循环,其数量级只有n3 ,所以时间复杂度为 T=O(n3

    空间复杂性:因为所需要用到的空间只是存储m(i,j),所以其空间复杂度为T=O(n2)。

    1、二分插入排序法:(课本224):可能性大

    void binSort(SortObject * pvector)

    {
    int i, j, left, mid, right;
    RecordNode temp;
    for( i = 1; i < pvector->n; i++ )
    {
    temp = pvector- >record[i];
    left = 0; right = i – 1;    
         while (left <= right)
        {
         mid = (left+right)/2;

    if (temp.key < vector->record[mid].key)
         right = mid-1;

    else

             left = mid+1;

    }//while

    for(j=i-1; j>=left; j--)

    pvector->record[j+1] =

    pvector->record[j];     if(left != i)

    pvector->record[left] = temp;

    }// for

    } // binSort

    算法思想描述:在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
    中间的那个元素比,如果小,则对前半再进行折半,否则对后半
    进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
    的所有元素后移,再把第i个元素放在目标位置上。

    时间复杂性分析:

    算法的移动次数:

    1. 最坏的情况为n2/2
    2. 最好的情况为n
    3. 平均移动次数为O(n2)

    所以二分法插入排序算法的平均时间复杂度为T(n)= O(n2)

    空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)

    2、下溢排序法:(课本226):可能性小

    S1. k←n。

    S2. j←l,lab←0。

    S3. 若x(j)>x(j+1),则转S4,否则,转S5。

    S4. r←x(j),x(j) ←x(j+1),x(j+1) ←r,lab←l。

    S5. j←j+1。

    S6. 若j<k,则转S3,否则,转S7。

    S7. 若lab=1,则作【k←k-1,转S2】,否则,结束

    时间复杂性分析:

    下溢排序最好时间复杂度是O(n),下溢排序最坏时间复杂度为O(n2),

    下溢排序平均时间复杂度为O(n2)

    空间复杂度分析:由于在查找中,n个元素占用空间为n,故其空间复杂度为O(n)

    作者:johnny 出处:http://www.cnblogs.com/sunjunlin 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【OpenStack】OpenStack系列16之OpenStack镜像制作
    【OpenStack】OpenStack系列15之OpenStack高可用详解
    【OpenStack】OpenStack系列14之Dashboard定制开发
    【OpenStack】OpenStack系列13之Nova源码解析与API扩展
    linux之scp命令
    阿里大鱼短信平台
    count(1)与count(*)
    java中枚举类到高级使用
    idea中mybatis-plugin破解
    mmall项目之问题一(mavenplugin问题)
  • 原文地址:https://www.cnblogs.com/sunjunlin/p/1794984.html
Copyright © 2011-2022 走看看