算法分析与设计复习题

  1. 对数组80,18,72,95,29,45,12进行一步选择排序(选择最小值与下标0的位置进行交换)的结果是(12,18,72,95,29,45,80)

  2. 矩阵 A 1 A_1 A1大小为30×35,矩阵 A 2 A_2 A2大小为35×15,矩阵 A 3 A_3 A3大小为15×5,则 A 1 × A 2 × A 3 A_1×A_2×A_3 A1×A2×A3最优解的数乘次数为(7875)

  3. 动态规划和分治法在分解子问题方面的不同点是(前者分解子问题重叠,后者分解子问题相对独立)

  4. 分治法的基本步骤(分解、递归、组合)

  5. 快速排序采用(分治法)算法设计

  6. 当某一算法的复杂度分析过程通过放大最终结算为n,则该算法的负责度表示为( O ( n ) O_{(n)} O(n))。

  7. 动态规划算法的基本要素为(最优子结构、子问题重叠)

  8. 堆排序的时间复杂度(n⋅logn)

  9. 回溯法采用(深度优先)策略

  10. 算法的时间复杂度指算法中的(元运算)的执行次数

  11. 数据的逻辑结构(线性结构、树形结构、图形结构),物理结构(顺序结构、链式存储)

  12. 下面程序段的时间复杂度为:( O ( ( m ∗ n ) ) O_((m*n) ) O((mn))

    for (i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        A[i][j]=i*j;
    
  13. 哈夫曼编码:构造哈夫曼树,写出各字符的哈夫曼编码,计算平均码长

    1. 假设通讯电文中只用到A、B、C、D、E、F这6个字母,它们在电文中出现的相对频繁分别为8、3、16、10、5、20,试构造该字符集的最优解的最优前缀码,并计算平均码长
    2. 设字符集合D={a,b,c,d,e,f,g,h,i},各字符出现的相对频率分别是7、18、3、32、5、26、12、8,以此构造一颗哈夫曼树和字符集的最优解前缀码,并计算平均码长
  14. 快速排序过程,或快速排序算法法填空

    1. 设待排序序列为{18,50,61,12,25,17,8,87},采用快速排序方法进行升序排列,请写出每一趟的排序结果。 0 : 18 , 50 , 61 , 12 , 25 , 17 , 8 , 87 1 : 8 , 17 , 12 , [ 18 ] , 25 , 61 , 50 , 87 2 : [ 8 ] , 17 , 12 , [ 18 , 25 ] , 61 , 50 , 87 3 : [ 8 ] , 12 , [ 17 , 18 , 25 ] , 50 , [ 61 ] , 87 4 : [ 8 , 12 , 17 , 18 , 25 , 50 , 61 , 87 ] \\ \begin{array}{r}0:18,50,61,12,25,17,8,87\\1:8,17,12,[18],25,61,50,87\\2:[8],17,12,[18,25],61,50,87\\3:[8],12,[17,18,25],50,[61],87\\4:[8,12,17,18,25,50,61,87]\end{array} 0:18,50,61,12,25,17,8,871:8,17,12,[18],25,61,50,872:[8],17,12,[18,25],61,50,873:[8],12,[17,18,25],50,[61],874:[8,12,17,18,25,50,61,87]
    2. 设待排序序列为{27,46,5,18,16,51,32},采用快速排序方法进行升序排序,请写出每一趟的排序结果。 0 : 27 , 46 , 5 , 18 , 16 , 51 , 32 1 : 16 , 18 , 5 , [ 27 ] , 46 , 51 , 32 2 : 5 , [ 16 ] , 18 , [ 27 ] , 32 , [ 46 ] , 51 3 : [ 5 , 16 , 18 , 27 , 32 , 46 , 51 ] \\\begin{array}{r}0:27,46,5,18,16,51,32\\1:16,18,5,[27],46,51,32\\2:5,[16],18,[27],32,[46],51\\3:[5,16,18,27,32,46,51]\end{array} 0:27,46,5,18,16,51,321:16,18,5,[27],46,51,322:5,[16],18,[27],32,[46],513:[5,16,18,27,32,46,51]
  15. 矩阵连乘问题 m [ i , j ] = { 0 , i = j m i n i ≤ k < j { m [ i ] [ k ] + m [ k + 1 , j ] + p i − 1 p k p j } , i < j \\m[i,j]=\begin{cases}0,i=j\\\begin{aligned}min_{i\leq km[i,j]={0,i=jminik<j{m[i][k]+m[k+1,j]+pi1pkpj},i<j

    1. 设有四个矩阵 A 1 A 2 A 3 A 4 A_1 A_2 A_3 A_4 A1A2A3A4,它们的维数分别是: A 1 = 50 ∗ 10 、 A 2 = 10 ∗ 40 、 A 3 = 40 ∗ 30 、 A 4 = 30 ∗ 5 A_1=50*10、A_2=10*40、A_3=40*30、A_4=30*5 A1=5010A2=1040A3=4030A4=305。采用动态规划方法找出一种数相乘次数最少的计算次序。构造最优值数组m和记录最优断开位置的数组s,并求最少连乘次数。 A 1 ( A 2 ( A 3 A 4 ) ) A_1 (A_2 (A_3 A_4 )) A1(A2(A3A4)),连乘次数10500
    2. 设有五个矩阵 A 1 A 2 A 3 A 4 A 5 A_1 A_2 A_3 A_4 A_5 A1A2A3A4A5,它们的维数分别是: A 1 = 2 ∗ 5 、 A 2 = 5 ∗ 4 、 A 3 = 4 ∗ 6 、 A 4 = 6 ∗ 2 、 A 5 = 2 ∗ 3 A_1=2*5、A_2=5*4、A_3=4*6、A_4=6*2、A_5=2*3 A1=25A2=54A3=46A4=62A5=23。采用动态规划方法找出一种数相乘次数最少的计算次序。构造最优值数组m和记录最优断开位置的数组s,并求最少连乘次数。
  16. 最长公共子序列问题:A先生找到了其失散多年的兄弟。为了确定血缘关系,A先生决定做DNA鉴定。A先生基因片段为{A,C,T,C,C,T,A,G},A先生兄弟基因片段为{C,A,T,T,C,A,G,C},采用动态规划策略找出两人基因片段最长的相同部分,即最长公共子序列Q。并给出记录最长公共子序列长度的数组c。 c [ i ] [ j ] = { 0 , i = 0 , j = 0 c [ i − 1 ] [ j − 1 ] + 1 , i , j > 0 ; x i = y i m a x { c [ i ] [ j − 1 ] , c [ i − 1 ] [ j ] } \\c[i][j]=\begin{cases}0,i=0,j=0\\c[i-1][j-1]+1,i,j>0;x_i=y_i\\max\{c[i][j-1],c[i-1][j]\}\end{cases} c[i][j]= 0,i=0,j=0c[i1][j1]+1,i,j>0;xi=yimax{c[i][j1],c[i1][j]}

  17. 用prim算法和knapsack算法构造最小生成树

  18. 虚拟汽车加油问题算法实现代码。

        sum 存放最少加油次数,s 表示最近一次加满油后已经过的路程。
    int greedy(int *x,int k,int n) {
        int sum = 0,s = 0;
        for (int j = 0;j <= n;j++) { //先扫描一遍确认无单次距离超过行驶距离k
            if (x[j]>k) cout<<"no solution"<n) {
                sum+=1;
                s=x[j];
            }
        }
        return sum;
    }
    
  19. 大整数相乘算法实现代码。

    #include 
    #include 
    use namespace std;
    
    int digit(long x) {
        int i = 0;
        if (x==0) return 1;
        while(x!=0) {
            i++;
            x=x/10;
        }
        return i;
    }
    int mult(int X,int Y) {
        int n = digit(X);
        cout<>x>>y) {
            cout<

你可能感兴趣的:(软件工程专业课资料整理,算法)