数据结构实训总结
PINGDINGSHAN UNIVERSITY
数据结构实训
院(系): 软件学院
专业年级: 软件工程 2009级
姓 名: 李乾坤
学 号: 091530108
指导教师: 刘高原 讲师
2011年06月18日
查找排序
需求分析
对一组无序数据进行排序,找出排序后某一数据所在的位置。
概要设计 略
详细设计 略
算法分析
简单地说,冒泡法就是先找最小值,再找次小值……,快排则是在一次循环中使它们局部有序,多次循环,直至全部有序为止。二分查找充分利用了有序序列的特性,从某种意义上讲,二分查找侧重的不是比较两个数是不是相等,而是确定要查找的数的范围。
程序总结
这个算法给我的最大启发就是我们要充分利用已有的信息。比如对已经排好序的数据进行查找,如果只是平淡的顺序查找,就比二分查找的效率低很多。为什么?因为二分查找考虑并利用了这些信息。同样的理论还可以用来解释为什么快排就比冒泡来得快,排序说白了就是为每一个数找到一个它应该呆的位置。假如为1~10排序,冒泡排序说白了就是一开始先找最大值移到最上边,这没错,关键是次小值又从底部开始找,使以前做的许多移动又有一部分重复了。快排则是,我不管以前怎么着,8碰到5就得放5的右边这总没错吧,以后碰到合适的再移动,但8和5的相对移动不会再重复了。由此观之,消除程序中的重复工作是提高效率的关键,不过高效率的算法可不是长在树上的(说有就有的),比如二分搜索排序,即使看起来很简单,能想起来这么做却是非常不简单的。
0-1背包问题(Bag)
需求分析
从若干个具有一定价值和质量的物品挑出一些放入具有容量限制的背包,使背包的所容纳物品的价值最大。
概要设计
三个面板类,用card布局依次显示
详细设计
1)第一个card负责设置背包容量和最大物品个数
2)第二个card负责输入物品名称、重量、价格
3)第三个card显示结果
算法分析
本算法的关键是建立递归公式:m[i][j],m[n][j]
m(i,j)= max{m(i+1,j),m(i+1,j-wi)+vi} j>=wi
m[i][j]=
m(i+1,j) 0=
m(n,j)= vn j>wi
m[i][j]=
0=
算法的主要思路就是将这个公式程序化,所以说数学建模很重要。在这里我觉得最精华的倒不是算法实现,最重要的有两点:一、动态规划法的思维方式,这种解题方式可以说是递归迭代,也可以认为是建了一个表去记录已经完成的运算成果以方便后边使用,避免重复运算。二、是用一种间接的方式保存被选中的物品,也就是这个表(m(i,j)),没有这个表就没有这个算法。
程序总结
通过完成此次试验,对动态规划法感慨良多。0-1背包问题的本质就是判断一个物品该不该放到背包里,然而这种判断还依赖于其他物品的选择,比较方便的方法就是穷举法,判断所有可能的状况,但这样的效率就太低了。解决一问题总有一个量来衡量解决这个问题所需要做的最少工作,编程的一个目标就是如何是计算机的效率更好的逼近这个量。研究穷举法我们会发现有很多重复的运算,优化穷举法的重要思路就是利用动态规划法的思想:利用已有的成果以避免重复运算,未进行的运算可以以已进行的运算为基础。因此我们必须有一种信息的表示方式来说明这个运算已经进行过了,反映到数学上就是发现运算之间的迭代关系。
我们再从另一个角度去理解。吃饭要一口一口的吃,解决问题的一个重要方法就是缩小问题规模。如何缩小问题规模是个大学问,我们解决问题一般都有两种方法论——递推和递归,递推在这里很明显需要大量的回溯,或者直接就是低效率的穷举法。如果从递归方面看,我们先假设一个最优的结果,然后再看背包容量减少后的最优结果,这样一直迭代。算法的设计是最费脑筋的,但是查看一个优秀的算法非常有助于培养人们灵活的思维方式。
最短路径问题(LJ)
需求分析
为用户提供一种输入手段获得一个无向图(或邻接矩阵),出发点和目的地,通过一定算法得到出发点到目的地的最短路径,显示给用户。
概要设计
三、详细设计
数据类
结点类Node
此类负责记录结点信息:坐标(x,y),结点名称,结点序号
边类
此类负责记录结点之间连线的信息:起点序号,终点序号,起点和终点的距离
我们在用户输入界面中建立两个向量对象,分别