20172301 《Java软件结构与数据结构》实验三报告
20172301 《Java软件结构与数据结构》实验三报告
课程:《Java软件结构与数据结构》
班级: 1723
姓名: 郭恺
学号:20172301
实验教师:王志强老师
实验日期:2018年11月20日
必修/选修: 必修
一.实验内容
实验一
实验二
实验三
实验四
实验五
二.实验过程及结果
实验一:
实验一是比较简单的,代码是书上的代码。主要是Junit测试因为好久没有用过,总是会有一些错误,类似junit测试方法前没有添加test
,或者junit测试的assert方法实现。
测试用例设计情况(正常,异常,边界,正序,逆序),关于测试用例,对于排序的异常,是ClassCastException
,是转换发生了错误。具体是例如1
、2
、3
、4
、a
、b
是不可以比的,也就是不能排序。
排序应该是没有边界测试的。
对于查找的异常,是ArrayIndexOutOfBoundsException
,是数组越界。即查找范围超过了数组范围。
查找应该是没有逆序测试的。
实验一测试结果截图:
查找测试:
排序测试:
实验二:
实验二首先要移到包里面,需要注意的是测试类的位置,需要放在项目的test
文件夹中,并且变更目录为Test Sources Root
。
实验二测试结果截图:
实验三:
七种查找算法分别是:线性查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找。之前的学过的查找方式,这里就不再多说了。
需要注意的是,插值查找和斐波那契查找都是二分查找的优化,所以他们所查找的序列应该也是有序的。
我重点解释一下分块查找。
在之前的学习中,我们学习过分块排序。那么类比推理一下,分块查找的原理应该也是类似的。分块查找的最大特点就应该是块内无序,块间有序。 通过这个特点,我们可以首先可以确定目标元素在哪个块里面,然后通过顺序查找确定其位置。
可以说,是一种折半查找和顺序查找的优化改进的方法。
那么这里,我直接用了之前的分块方法。
private static <T extends Comparable<? super T>> int partition(T[] data, int min, int max)
{
T partitionelement;
int left, right;
int middle = (min + max) / 2;
//使用中间数据值作为分区元素
partitionelement = data[middle];
// 暂时把它移开
swap(data, middle, min);
left = min;
right = max;
while (left < right)
{
// 搜索一个元素,它是>分区元素
while (left < right && data[left].compareTo(partitionelement) <= 0)
left++;
// 搜索一个元素,它是<分区元素
while (data[right].compareTo(partitionelement) > 0)
right--;
// 交换元素
if (left < right)
swap(data, left, right);
}
// 将分区元素移动到适当的位置
swap(data, min, right);
return right;
}
然后,在分块查找里划分为几个部分。
int partition = partition(data,min,max);
int leftPartition = partition(data,min,partition-1);
int rightPartition = partition(data,partition+1,max);
判断具体位置后,进行线性查找。
实验三测试结果截图:
实验四:
这里的排序算法是希尔排序,堆排序,二叉树排序。
这里还是重点介绍一下希尔排序。因为有关第八周的测试,希尔排序学长提出了一点问题。
这里我先放出我当时的答案。
学长说这里应该是4插入到13的前面。
我们这里就应该注意希尔排序的基本思想:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
希尔排序也是插入排序,对简单插入排序的改进方法。
所以,对于这道题来说,最后4应该直接插入到13的前面。
实验四测试结果截图:
异常:
实验五:
基于安卓实现查找和排序功能。是之前实验的一个整合。
实验五测试结果截图:
三. 实验过程中遇到的问题和解决过程
- 问题1:实验三中七种查找算法中的斐波那契查找,对于其中扩展数组的操作,C++实现:
int * temp;//将数组a扩展到F[k]-1的长度
temp=new int [F[k]-1];
memcpy(temp,a,n*sizeof(int));
int * temp
是声明一个int
类型的数组。
memcpy()
方法应该是有关复制的操作,在java中应该如何实现。
- 问题1解决方案:
memcpy()
函数- 函数原型:void *memcpy (void*dest, const void *src, size_t n);
- 功能:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
由此,这个功能应该就是复制原数组到一个新数组中。
在java上有多种实现方式:
- for循环代码可以说是很直观,灵活并且便于理解,但是效率有时候不高。
// 通过for循环
int[] array2 = new int[5];
for(int i = 0;i < array1.length;i++) {
array2[i] = array1[i];
}
for(int i = 0;i < array2.length;i++) {
System.out.print(array2[i]);
}
System.out.println();
- System.arraycopy()方法通过源码可以观察到
native
,是原生态方法,效率自然更高。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
- Arrays.copyOf()方法在源码上是基于System.arraycopy(),所以效率自然低于System.arraycpoy()。
// 通过Arrays.copyOf()
int[] array4 = new int[5];
array4 = Arrays.copyOf(array1, 5);
for (int i = 0; i < array4.length; i++) {
System.out.print(array4[i]);
}
- Object.clone()方法从源码来看也是native方法,但返回为Object类型,所以赋值时将发生强转,所以效率不如之前两种。
// 通过Object.clone()
int[] array5 = new int[5];
array5 = array4.clone();
for (int i = 0; i < array5.length; i++) {
System.out.print(array5[i]);
}
其他(感悟、思考等)
- 这周做完实验没有及时总结,因为时间比较久远,导致有一些错误和解决方法都有所遗忘。部分参考资料还是在浏览器的历史记录中淘到的。以后要对错误及时总结,养成良好的学习习惯。
参考资料
20172301 《Java软件结构与数据结构》实验三报告的更多相关文章
- 20172301 《Java软件结构与数据结构》实验二报告
20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...
- 20172301 《Java软件结构与数据结构》实验一报告
20172301 <Java软件结构与数据结构>实验一报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...
- 20172329 2018-2019 《Java软件结构与数据结构》实验三报告
20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...
- 20172302 《Java软件结构与数据结构》实验三:查找与排序实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月19日 必修/选修: 必修 实验内容 (1) ...
- 20172302 《Java软件结构与数据结构》实验二:树实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参 ...
- 20172329 2018-2019-2 《Java软件结构与数据结构》实验二报告
20172329 2018-2019-2 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...
- 172322 2018-2019-1 《Java软件结构与数据结构》实验一报告
172322 2018-2019-1 <Java软件结构与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师 ...
- 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告
课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...
- 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结
20172328 2018-2019<Java软件结构与数据结构>第三周学习总结 概述 Generalization 本周学习了第五章:队列.主要内容包含队列的处理过程.如何用对例如求解问 ...
随机推荐
- 假装会python--爬取贴吧正文
贴吧的老历史想存下来,强行python爬取一波 队友太强,躺好别动,偶尔做点副业 假装会python 基本流程: 1.爬取页面,获取页面的html源码 2.分析源码 通过正则表达式 匹配到想要的内容 ...
- 【CSS】定义元素的位置
CSS定义元素的位置html元素的position属性,有4个属性值,分别是static.relative.fixed.absolute static: 1.默认值,一般不显式设置为static 2. ...
- 用vue前后端分离项目开发记录
一:软件安装 1.1 检测node 是否安装 1.2 安装淘宝镜像 cnpm 1.3 安装vue-cli 1.4 检查是否安装vue-cli脚手架成功 1.5安装webpack 模块管理工具 二:创建 ...
- 字符串日期转化以及yyyy-MM-dd HH:mm:ss大小写解释
字符串日期转化 字符串转换为Calendar对象: // 日期字符串 private String dateStr; // 将字符串转换后的Calender对象 private Calendar ca ...
- HDU 1730 类NIM模型
两者间的间距就是可取石子数,因为对于行内黑白相连的局面该子游戏已经结束了因为此时不管先手再怎么移都是必败,SG=0的终止态 /** @Date : 2017-10-14 21:46:21 * @Fil ...
- FFmpeg编码扩展之————编码库的扩展(libfdk-aac)
ffmpeg windows版没有libfdk-acc 请求该地址下载:http://tmod.nmm-hd.org/FFmpeg/
- 【51Nod】1519 拆方块 贪心+递推
[题目]1519 拆方块 [题意]给定n个正整数,\(A_i\)表示第i堆叠了\(A_i\)个石子.每轮操作将至少有一面裸露的石子消除,问几轮所有石子均被消除.\(n \leq 10^5\). [算法 ...
- 两个不能同时共存的条件orWhere查询
举例: //我的所有的积分记录 1,我分享的:2,我点击的:(两个条件不能共存) $activity_log = ActivitySharedLog::where(function ($query) ...
- Oracle 修改用户名
1.开始- 运行 - 输入“CMD” 确定 2.在弹出来的窗口中,输入:SQLPLUS / AS SYSDBA 回车 3.然后,用命令修改:alter user 用户名 identified by ...
- js input输入框的总结
一.输入框只能输入数字 原文:https://www.cnblogs.com/sese/p/5872144.html 分享下js限制输入框中只能输入数字的方法,包括整数与小数,分享几个例子,有需要的朋 ...