• 热点
  • 图片
  • 科技
  • 娱乐
  • 游戏
  • 体育
  • 汽车
  • 财经
  • 搞笑
  • 军事
  • 国际
  • 时尚
  • 旅游
  • 探索
  • 育儿
  • 养生
  • 美文
  • 历史
  • 美食
  • 当前位置: 小苹果范文网 > 历史 > 正文

    算法设计及解析总结计划练习习题x

    时间:2020-11-20 07:40:12 来源:小苹果范文网 本文已影响 小苹果范文网手机站

    《算法设计与分析》习题

    第一章算法引论

    1、 算法的定义

    答:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程。

    通俗讲,算法:就是解决问题的方法或过程。

    2、 算法的特征

    答: 1) 算法有零个或多个输入;

    

    2 ) 算法有一个或多个输出;

    

    3) 确定性 ; 4) 有穷性

    3、 算法的描述方法有几种

    答:自然语言、图形、伪代码、计算机程序设计语言

    4、 衡量算法的优劣从哪几个方面

    答: (1) 算法实现所耗费的时间(时间复杂度) ;

    (2) 算法实现所所耗费的存储空间(空间复杂度) ;

    算法应易于理解,易于编码,易于调试等等。

    5、 时间复杂度、空间复杂度定义

    答:指的是算法在运行过程中所需要的资源(时间、空间)多少。

    6、时间复杂度计算:

    {i=1

    

    while

    i=i*2

    

    ( i<=n );

    

    }

    答:语句①执行次数 1 次,

    语句②③执行次数 f(n), 2^f(n)<=n,

    算法执行时间: T(n)= 2log2n +1

    时间复杂度:记为 O(log2n) ;

    

    

    f(n) <=log2n;

    递归算法的特点

    答:①每个递归函数都必须有非递归定义的初值;否则,递归函数无法计算;件)

    

    (递归终止条

    ②递归中用较小自变量函数值来表达较大自变量函数值;

    

    (递归方程式)

    8、算法设计中常用的算法设计策略

    答:①蛮力法; ②倒推法; ③循环与递归; ④分治法;

    ⑤动态规划法; ⑥贪心法; ⑦回溯法; ⑧分治限界法

    9、设计算法 :

    递归法:汉诺塔问题兔子序列(上楼梯问题)

    整数划分问题

    蛮力法:百鸡百钱问题

    倒推法:穿越沙漠问题

    答:算法如下:

    (1) 法

    void hanoi(int n, int a, int b, int c)

    {if (n > 0)

    {

    hanoi(n-1, a, c, b);

    move(a,b);

    hanoi(n-1, c, b, a);

    } }

    兔子序列( fibonaci 数列 )

    Int F(int n)

    {

    if(n<=2) return 1;

    else

    return F(n-1)+ F(n-2);

    }

    上楼梯

    Int F(int n)

    {

    if(n=1) return 1

    if(n=2) return 2;

    else

    return F(n-1)+ F(n-2);

    }

    整数划分

    描述:将正整数

    n 表示成一系列正整数之和, n=n1+n1+n3+?

    将最大加数不大于

    m 的划分个数, 作

    q(n,m) 。正整数 n 的划分数

    p(n)=q(n,n) 。

      可以建立 q(n,m) 的如下 关系:

    1

    n

    1, m

    1

    q( n, m)

    q(n, n)

    n

    m

    q( n,n

    1)

    n

    m

    1

    q(n, m

    1) q(n

    m, m)n

    m

    1

    算法:

    Int q( int n, int m){

    if(n<1||m<1) return 0;

    If((n=1)||(m=1)) return 1;

    If (n<m) return q(n,n);

    If(n=m) return q(n,m-1)+1;

    else

    return q(n,m-1)+q(n-m,m);

    }

    2) 蛮力法:百鸡百钱问题算法设计 1:

    设 x , y , z 分 别为 公鸡 、母 鸡、 小鸡 的数量。 约束条 件: x+y+z=100 且

    5*x+3*y+z/3=100

    main( )

    { int x,y,z; for(x=1;x<=20;x=x+1)

    for(y=1;y<=34;y=y+1)

    for(z=1;z<=100;z=z+1)

    if(100=x+y+z and 100=5*x+3*y+z/3)

    { print(the cock number is",x)

    print(the hen number is", y)

    print(the chick number is "z);}

    }

    算法分析:以上算法需要枚举尝试20*34*100=68000

    次。算法的效率显然太低

    算法设计 2:

    在公鸡( x)、母鸡( y)的数量确定后,小鸡

    的数量

    z 就固定为

    100-x-y ,

    无需再进行枚举了

    。此时约束条件只有一个:

    5*x+3*y+z/3=100

    main( )

    { int x,y,z; for(x=1;x<=20;x=x+1)

    for(y=1;y<=33;y=y+1) { z=100-x-y;

    if(z mod 3=0 and

    5*x+3*y+z/3=100)

    {print(the cock number is",x)

    

    print(the hen number is", y) print(the chick number is "z);} }

    

    }

    算法分析:以上算法只需要枚举尝试 20*33=660

    

    次。实现时约束条件又限定 Z 能被 3 整除时,

    才会判断“ 5*x+3*y+z/3=100 ”。这样省去了 z

    提高了算法的效率。

    (3) 倒推法:穿越沙漠问题

    desert ( )

    

    不整除 3 时的算术计算和条件判断,进一步

    {

    

    int dis

    

    , k, oil,k;

    

    2 )相同: 都是将原问题分解成小问题,通过小问

    题求解得到原问题解。

    不同:

    用分治法求解时 , 分解的子问题是互相独立的 , 且与原问题类型一致。分治算法实现一般用递归;

    动态规划方法经分解得到的子问题往往不是互相独立的;动态规划算法实现一般用循环 ;

    3)基本要素 :具有最 子 构;子 具有重叠性

    4)步 : 1) 分析最 解的性 ,并刻划其 构特征。

    推地定 最 。

    以自底向上的方式 算出最 .

    根据 算最 得到的信息,构造 的最 解.

    2、序列 X={X1, X2, ? Xm } 和 Y={Y1,Y2 ? Yn} 的最 公共子序列 Z={Z1,Z2, ? Zk}

    用 划的方法求序列

    X 和 Y 的最 公共子序列 度

    (要求按照 划写出 划求解 的步 分析①最 子 构②写出 方程

    ③算法描述)

    注: C[ m ][

    n] 序列 X 与 Y 的最 公共子序列的 度

    答:①最 子 构

    序列 X={ x 1, x2,?xm }

    序列 Y={ y

    1

    ,y

    ,?y } 的一个

    2

    n

    最 公共子序列

    Z={ z 1, z2,?zk }

    Ⅰ、若 xm= y n,

    zk =xm= y n,

    且 { z

    1, z2,?zk-1

    } 是序列 Xm-1 与

    序列 Y

    的最 公共自序列;

    n-1

    Ⅱ、若 x ≠y,

    且 x ≠ z

    k

    ,

    Z 是 X

    与 Y 的最 公共子序列;

    m

    n

    m

    m-1

    Ⅲ、若 xm≠yn,

    且 yn≠ z k,

    Z 是 X 与 Yn-1 的最 公共子序列 ;

    由此可 , 2 个序列的最 公共子序列包含了

    2 个序列的前 (去掉一个元素)

    的最 公共子序列。

    即,原 最 解,包含子 最 解;

    因此,最 公共子序列 具有最 子 构性 。

    ②写出 方程

    ③ 循环实现 , 算最

    C[ i][ j]

    ,算法描述

    Int lcsLength( x[ ], y[ ], b[ ][ ])

    { int m=; n=;

    for(int i=1; i<m;i++) C[i][0]=0; 游客可在 些游艇出租站租用游

    艇,并在下游的任何一个游艇出租站 游艇。

    游艇出租站 i 到游艇出租站 j 之 的租金 r(i , j) ,其中 1<=i<j<=n;

    一个算法, 算出游艇从出租站 1 到出租站 n 所需最少租金

    ( 集第三章 算法设计与计算题 T2)

    4、掌握 划方法求解0-1背包

    答: ①分析 的最 解 构

    ( y1,y 2, ?yn)所 0- 1 背包容量 M的解;

    ,( y2, ?yn)相 子 背包容量 M-w1 的解;

    (即原 最 解,包含了子 最 解)

    ② 定 最

    ③ 算最 m(i , j)

    void knapsack( int v[ ], int w[ ], int M, int m[ ] [ ] )

    {int n=;

    if ( M<w[ n] ) ntValue();ntValue(); ntValue(); ntValue(); //

    取下一扩展结点

    i++

    

    //

    

    进入下一层

    

    }

    }

    }

    double bound(int i)

    

    //

    

    计算上界函数

    {// 计算当前价值与剩余价值和

    double cleft = c - cw; // 剩余容量

    double b = cp; // 当前物品价值

    while (i <= n && w[ i] <= cleft) // 剩余物品单位重量价值递减序装入物品

    { cleft = cleft -w[ i];

    b= b + p[i];

    i++;

    } // w[ i]> cleft 跳出循环,物品部分装入背包

    if (i <= n) b += p[i]/w[i] * cleft;

    return b; // 当前物品价值与剩余物品价值之和

    }

    时间复杂度分析: 计算上界时间为

    界; 故该算法的时间复杂度为

    

    O(n);在最坏的情况下,有

    n

    

    2n 个右孩子节点需要计算上

    5、利用 FIFO 分支限界算法 , 给出下列 0-1 背包最优装载的求解步骤

    背包载重: M= 10; 物品重量: w1= 6、w2= 5、 w3= 5; 物品价值: p1= 42、 p2=25、p3= 30

    解: 1) 解空间:

    2)求解过程:

    第 8 章 NP 完全性理论

    1、什么是易解问题什么是难解问题难解问题分为哪两类

    答: 1)易解问题:人们将存在多项式时间 算法的问题称为易解问题

    

    ;

    2)难解问题:将需要在指数时间内解决的问题称为难解问题;

    3)难解问题有两类: 1 )不可判定问题 2 )非决定的难处理问题

    

    2、什么是不可判定问题什么是非决定的难处理问题

    答: 1)不可判定问题 :该类问题是不能解问题,它们太难了,以至于根本就不存在能求解它们的任何算法。

    2)非决定的难处理问题: 这类问题是可判定的(即可解的) 。

     但是,这类问题即使使

    用非决定的计算机,也不能在多项式时间内求解它们。

    3、什么是 P 类问题什么是 NP完全问题

    答: 1) P 类问题:是一类能够用确定性算法在多项式时间内求解的判断问题。事实上,所

    有易解问题都属于 P 类问题。

    2)NP完全问题:对于某问题,很难找到其多项式时间的算法 ( 或许根本不存在

    如果给了该问题的一个答案,则可以在多项式时间内判定或验证这个答案是否正确。

    可以在多项式时间内验证一个解是否正确的问题称为 NP问题。

    

    ) ,但是

    这种

    4、列出几个典型的 NP完全问题

    答:( 1)图着色问题 COLORING

    2)路径问题 LONG-PATH

    3)顶点覆盖问题 VERTEX-COVER

    4)子集和问题 SUBSET-SUM

    5)哈密尔顿回路问题 HAM-CYCLE

    6)旅行商问题 TSP

    (7)装箱问题 BIN-PACKING , 能否用 k 个箱子来装 n 个物品;

    • 下载文档
    • 收藏
    • 0

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网