西电软院算法上机报告.docx
- 文档编号:6634637
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:10
- 大小:121.17KB
西电软院算法上机报告.docx
《西电软院算法上机报告.docx》由会员分享,可在线阅读,更多相关《西电软院算法上机报告.docx(10页珍藏版)》请在冰豆网上搜索。
西电软院算法上机报告
算法上机报告
学号:
13121234
姓名:
陈恒
实验一
1、实验内容
1.编写程序实现书上2.3.7:
运行时间为nlgn的算法确定n个整数的集合中是否存在两个数的和刚好为x。
先对n个整数的集合进行排序。
使用快速排序,时间复杂度即是nlgn,然后计算两数之和,可以知道快速排序(从小到大)后第一个元素begin为最小,最后一个元素end最大。
所以用最小和最大相加和x比较,大于x即是end太大,小于x就是begin太小。
一直循环直到begin==end时还没有就不存在了。
2.实现优先级队列。
用堆排序和一个结构体实现即可。
Java实现用类代替结构体。
并未编写测试用例。
3.实现快速排序。
问题1就是快速排序。
最大数比较是有序的数组,例如123456789.最小的比较是每次partition都能分成恰好两半,例如132。
n个相同的数快排比较计算次数n*(n-1)/2.原理:
每次分一半都要从头到尾(比较n-1次)比较一次,最后分到每组只有2个为止(即是分n/2次)。
4.找两个已排序不同数组之间第k大的数。
有a,b两个数组。
把A,B平均分为前后两个部分,前部分有x个元素,后部分有n-x个元素(比如,由于A是有序的,所以后一部分的所有元素大于前一部分)。
A[x]=A的后一部分的第一个元素)。
然后使用分枝-限界法和递归。
每次比较k和a.size/2+b.size/2以及a[x]于b[x]的大小。
进而缩小其中一个数组一半大小。
实验截图:
第一个:
题目1和3第二个:
题目4,优先级队列没有写主方法
2、实验心得
本次实验对排序几个关键算法进行了实现,还练习了别的几个问题。
本来算法是很简单的,但是由于数组下标的原因总是出现越界问题。
说明在具体编程的时候还缺乏思考,需要多加训练。
还有就是选择分支的时候需要写下来不然光去想是很难把情况完全列出来的。
实验二
1、实验内容
以动态规划算法解决以下几个问题
动态规划思想是找到并求解问题的最优子结构,然后递归定义最优子结构,再用自底向上的方法去构建一张表,最后用查表找到解。
1.矩阵连乘
最优子结构的递归求解公式为:
题目运行求解:
2.LCS最长公共子序列
最优子结构的递归求解公式为:
题目求解运行:
3.LcsubString最长公共子字符串
4.求解两点间最短路径,写的时候没有用迪杰斯特拉算法,用的floyd算法,后来补了一个迪杰斯特拉。
由于实验题目太长输入太繁琐,自己输入了一组测试数据:
一行“ijk”这样的输出表示i到j的长度为k没有中间节点
一行“ijk‘\n’m”这样的输出表示i到j的长度为k经过节点m。
Floyd算法截图:
2、实验心得
本次实验主要是练习动态规划,最开始的时候我以为两个lcs是一个题目,后来想到子字符串和子序列是不一样的。
最后一个求0-15的最短路径。
由于矩阵太大没有进行输入,但验证得知程序没有问题的。
问题主要还是在于数组下标对齐上。
然后具体编程前先看好伪代码能够更快速的实现。
实验三
一、实验内容
用贪心算法解决这些问题。
贪心算法的思想是找到每一步的当前最优解,但不一定是整体最优解。
最后遍历或是递归完成找到解。
1.0-1背包和分数背包问题。
使用贪心法求解每次取出满足重量的价重比最高的那个。
可以先按照价重比排序,然后每次取数组的下一个,验证是否满足重量即可。
题目运行:
2.简单任务调度。
同时到达?
这是我的理解,因为没有说开始时间之类的。
找到当前运行时间最短的任务运行即可。
不用排序的话就是两次循环,内层循环找到当前存在的最短任务,外层循环控制任务剩余数。
伪码就不写了。
题目运行:
3.单源点最短路径。
Bellmanford算法解决含负路径的矩阵距离。
但是不可以有负回路。
如果遇到负回路就输出错误信息。
实验题目运行:
4.所有成对点最短路径
这在第二次实验中实现的算法。
这里贴的是迪杰斯特拉的图:
2、实验心得
理解了动态规划和贪心算法的区别与相同点以及各自的特点。
对于动态规划而言:
全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
条件是最优子结构;重叠子问题。
方法是自底向上构造子问题的解。
对于贪心算法而言。
条件是每一步的最优解一定依赖上一步的最优解。
方法是从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。
当达到某算法中的某一步不能再继续前进时,算法停止。
但是贪心算法不能保证最后的解一定是最优解。
而且不能解最大最小问题。
这两种算法都是递推算法。
对子问题进行修剪。
两种算法要求问题都具有的一个性质就是“子问题最优性”。
即组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的。
实验四
1、实验内容
回溯法采用试错的思想,简单地说就是穷举法,但是遇到不能满足条件的时候就取消上一步甚至取消好几步。
通常采用递归实现。
1.回溯法解0-1背包。
对表空间不断尝试,建立解空间树,输出最大的解即可。
算法思想:
当前取得背包value的大小current
当前取得背包weight和要取得的下一个物品的的大小weight
Choose(number)
If(number>=背包.size)
max=max Current: max;return; If(weight<=100)加入该物品choose(number+1)减去该物品 Choose(number+1) 2.八皇后问题。 用8个1去填8*8的矩阵,每行每列和对角线上都不能重复出现1。 同样是不断尝试解空间,用限定条件去判断该解是否可行,然后递归求解,当有合适解时输出。 递归: 以列为基础对该列每一个元素进行判断,满足判断要求即可继续递归,反之抛弃该分支。 当所有元素都遍历完,输出解组。 判断: 不在同一行或是对角线或是同一列上。 实验运行图示: 0-1背包: 八皇后: 二、实验心得 这次实验是对回溯法的实践。 回溯法如果没有了限制条件就成了穷举法,所以如何设置限制条件促使解空间缩小是回溯法的关键。 八皇后问题是回溯法的经典问题。 解决这些问题使得我更加理解了回溯法。 也使得代码编写的能力更强了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西电软院 算法 上机 报告