20172301 《Java软件结构与数据结构》实验三报告

课程:《Java软件结构与数据结构》

班级: 1723

姓名: 郭恺

学号:20172301

实验教师:王志强老师

实验日期:2018年11月20日

必修/选修: 必修

一.实验内容

实验一

实验二

实验三

实验四

实验五

二.实验过程及结果

实验一:

实验一是比较简单的,代码是书上的代码。主要是Junit测试因为好久没有用过,总是会有一些错误,类似junit测试方法前没有添加test,或者junit测试的assert方法实现。

测试用例设计情况(正常,异常,边界,正序,逆序),关于测试用例,对于排序的异常,是ClassCastException,是转换发生了错误。具体是例如1234ab是不可以比的,也就是不能排序。



排序应该是没有边界测试的。

对于查找的异常,是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软件结构与数据结构》实验三报告的更多相关文章

  1. 20172301 《Java软件结构与数据结构》实验二报告

    20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  2. 20172301 《Java软件结构与数据结构》实验一报告

    20172301 <Java软件结构与数据结构>实验一报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  3. 20172329 2018-2019 《Java软件结构与数据结构》实验三报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验三报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  4. 20172302 《Java软件结构与数据结构》实验三:查找与排序实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月19日 必修/选修: 必修 实验内容 (1) ...

  5. 20172302 《Java软件结构与数据结构》实验二:树实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年11月5日 必修/选修: 必修 实验内容 (1)参 ...

  6. 20172329 2018-2019-2 《Java软件结构与数据结构》实验二报告

    20172329 2018-2019-2 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...

  7. 172322 2018-2019-1 《Java软件结构与数据结构》实验一报告

    172322 2018-2019-1 <Java软件结构与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师 ...

  8. 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告

    课程:<Java软件结构与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年9月26日 必修/选修: 必修 实验内容 (1)链 ...

  9. 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第三周学习总结 概述 Generalization 本周学习了第五章:队列.主要内容包含队列的处理过程.如何用对例如求解问 ...

随机推荐

  1. 莫比乌斯反演学习笔记+[POI2007]Zap(洛谷P3455,BZOJ1101)

    先看一道例题:[POI2007]Zap BZOJ 洛谷 题目大意:$T$ 组数据,求 $\sum^n_{i=1}\sum^m_{j=1}[gcd(i,j)=k]$ $1\leq T\leq 50000 ...

  2. CF1027E Inverse Coloring

    题意:n × n的矩阵,每个位置可以被染成黑/白色. 一种gay的染色是任意相邻两行的元素,每两个要么都相同,要么都不同.列同理. 一种gaygay的染色是一种gay的染色,其中没有哪个颜色的子矩阵大 ...

  3. 函数和常用模块【day06】:json模块(十一)

    本节内容 1.dumps序列化和loads反序列化 2.dump序列化和load反序列化 3.序列函数 1.dumps序列化和loads反序列化 dumps()序列化 1 2 3 4 5 6 7 8 ...

  4. python---django使用数据库(orm)

    官方教程点击此处 项目默认使用sqlite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os. ...

  5. git push --set-upstream

    我在本地建了一个分支wangxiao,开发完之后,提交代码 git add .git commit -m '注释'git push 出现下面的问题,这个意思是:当前分支没有与远程分支关联. 因此导致了 ...

  6. bzoj千题计划286:bzoj1226: [SDOI2009]学校食堂Dining

    http://www.lydsy.com/JudgeOnline/problem.php?id=1226 关键点:一个人只能忍受 ‘紧跟’ 在他 后面的b个人比他先打到饭 dp[i][j][k] 前i ...

  7. 51Nod 1684 子集价值 (平方和去括号技巧)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1684 题意: 新建一个位运算,求所有子集通过这个位运算后的答案的平方和是 ...

  8. Flex 经验笔记二

    向 Module 传递数据:好像只能传递些像 整型,字符型等简单类型的数据,也能传递像 json 这样的 Object 对象,但如果 Object 对象是从层的,其子级数据,好像也读取不到. func ...

  9. Zookeeper笔记之使用zk实现集群选主

    一.需求 在主从结构的集群中,我们假设硬件机器是很脆弱的,随时可能会宕机,当master挂掉之后需要从slave中选出一个节点作为新的master,使用zookeeper可以很简单的实现集群选主功能. ...

  10. 关于caffe的安装问题

    在caffe的安装过程中,出现 /usr/bin/ld: cannot find -lcblas /usr/bin/ld: cannot find -latlas的问题 这时解决方案为http://s ...