算法设计与分析试题+实验java代码


一、选择题(每题1分共10分)

分支限界法解旅行售货员问题时,活结点表的组织形式是()

A.最小堆B.最大堆C.栈D.数组

一个问题可用动态规划或贪心算法求解的关键特征是问题的()
A.重叠子问题 B.最优子结构性质C.贪心选择性质D.定义最优解

回溯法的效率不依赖于下列哪些因素()。

A.满足显约束的值的个数?

B.计算约束函数的时间

C.计算限界函数的时间

D.确定解空间的时间

贪心算法与动态规划算法的主要区别是()。

A.最优子结构B.贪心选择性质C.构造最优解D.定义最优解

算法分析中,记号Ω表示()

A. 渐进下界B.渐进上界C.渐进精确界记号D.以上都不是

FIFO是()的搜索方式。

A.分支界限法B.动态规划法C.贪心法D.回溯法


二、判断题(每题1分共10分)

优先队列式分支限界法按照优先队列中规定的优先级,选取优先级最高的结点,成为当前扩展结点。√

使用限界函数作优先级, 第一个扩展的叶子就是最优解。√

解决旅行商问题,采用的是优先队列式分支限界法。√

优先队列式分支限界为了加速搜索的进程,按照优先队列中规定的优先级,选取优先级最高的结点,成为当前扩展结点。√

分支界限法采用深度优先策略搜索。×  广度
……


三、算法(每题10分共20分)

考察基本算法,补充代码 

按照书里的顺序来复习

绪论
……

2.9线性时间选择
3 动态规划 过程画图
……
3.3最长公共子序列LCS
递归结构 最优子结构性质 穷举(搜索)法 反证法
……
3.9 0-1背包问题
最优子结构性质 递归关系
knapsack最优值 traceback最优解
①初始化  p[n+1]=(0,0)  向量(变量,价值)
②求向量和  q[n+1]=p[n+1]  条件:q中所有向量的重量<=c  +(wn,vn)    跳跃点
③合并  p[n]=p[n+1]∪q[n+1]
④重复②③  知道求p[1]   

3.10 最优二叉搜索树obst
最优子结构性质 递归计算最优值
0-1背包dp动态规划求最优解 自底向上
背包-贪心
分治-归并

  1. 分解:将原问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题。
  2. 解决:递归地解决各个子问题。当子问题的规模足够小时,可以直接求解。
  3. 合并:将各个子问题的解合并成原问题的解。

……
4.4哈夫曼编码

n个字符用O(nlogn)  贪心选择性质  最优子结构
4.5单源最短路径
Dijkstra领接矩阵  dist[i]表示当前从源到顶点i的最短特殊路径长度  迭代 最优子结构性质
……

5.2装载问题
回溯法 backtrack  O(2^n)
上界函数  剪枝
5.3批处理作业调度
回溯FlowShop 搜索排列树
backtrack 递归
……
5.7 最大团问题MaxClique
无向图 G=(V,E) 邻接矩阵
初始化 回溯搜索backtrack  O(n2^n)
……
概念 最大的全连接图 子树
分支限界法  剪枝

2.7合并/归并排序

public class MergeSort {//merge合并 sort排序
    public static void merge(int[] arr, int left, int mid, int right) {
        int n1 = mid - left + 1;
        int n2 = right - mid;
        int[] L = new int[n1];
        int[] R = new int[n2];
        for (int i = 0; i < n1; ++i)
            L[i] = arr[left + i];
        for (int j = 0; j < n2; ++j)
            R[j] = arr[mid + 1 + j];
        int i = 0, j = 0;
        int k = left;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }

        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }
    public static void sort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            sort(arr, left, mid);
            sort(arr, mid + 1, right);
            merge(arr, left, mid, right);
        }
    }
}

2.8快速排序(快排)

public class QuickSort {//partition分解
    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = (low - 1);
        for (int j = low; j < high; j++) {
            if (arr[j] <= pivot) {
                i++;

                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;
        return i + 1;
    }
    public static void sort(int[] arr, int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            sort(arr, low, pi - 1);
            sort(arr, pi + 1, high);
        }
    }
}



四、计算

考察算法执行过程 

算法复杂性分析 递归式

主方法

举个例子:T(n)=7T(n/2)+n²,n>1
上面的式子得a=7,b=2,k=2

∵a>b^k,7>2²=4  👉主方法-3
∴T(n)=O(n^log7)   b=2 底数可以省略

二分查找法的时间复杂度就是O (logN)(以2为底)



五、综合分析

代码+证明算法性质

例如什么最优子结构性质、贪心选择性质…… 

可能会有一些画图,例如最小生成树、最优路径等等

感谢观看~ 祝考试顺利,算法AC🎉

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值