课程:《程序设计与数据结构》
班级: 1723
姓名: 周亚杰
学号:20172308
实验教师:王志强
实验日期:2018年10月20日
必修/选修: 必修html
问题1:实验3是根据参考博客里的内容完成查找方法的编写,好比没有学过的斐波那契查找方法,可是博客里只给了C++的代码,在理解意思以后用Java写出来。
在写二分查找代码的时候,查找的结果出现了问题:如图
java
//二分查找(折半查找),版本1 int BinarySearch1(int a[], int value, int n) { int low, high, mid; low = 0; high = n-1; while(low<=high) { mid = (low+high)/2; if(a[mid]==value) return mid; if(a[mid]>value) high = mid-1; if(a[mid]<value) low = mid+1; } return -1; } //二分查找,递归版本 int BinarySearch2(int a[], int value, int low, int high) { int mid = low+(high-low)/2; if(a[mid]==value) return mid; if(a[mid]>value) return BinarySearch2(a, value, low, mid-1); if(a[mid]<value) return BinarySearch2(a, value, mid+1, high); }
我用的是递归方法
二分查找是在有序的基础上进行查找的:
参考博客给的方法须要传进去查找的范围,因此在找中间值的时候须要把下限加上
而后判断中间值与要查的值大小关系
若正好相等,直接返回要查值的索引位置
若不相等,则对中间值加减1,而后到新的折半区域求新的中间值,判断相等关系
......
如此递归下去算法
debug以后,发现问题所在:参考博客里的代码有点问题
方法是相似于上面所说的,可是每一次递归都缺乏一次判断:
即每一次递归,新的索引中间值都会增或减1,即缺乏判断中间值到达边界的条件
若是要查找的值并不存在,则查到边界的时候,就会越界数据结构
在博客的评论里也有人回复了
测试
加上条件以后便可命令行
插值算法与二分查找相似,存在同样的问题
代码以下:debug
//插值查找 int InsertionSearch(int a[], int value, int low, int high) { int mid = low+(value-a[low])/(a[high]-a[low])*(high-low); if(a[mid]==value) return mid; if(a[mid]>value) return InsertionSearch(a, value, low, mid-1); if(a[mid]<value) return InsertionSearch(a, value, mid+1, high); }
插值查找再也不是一半一半的查找,而是根据所给查找的长度大小来分割查找的区域设计
修改后的代码以下:3d
public static boolean InsertionSearch(Integer[] data, int min, int max, int target){ boolean flag= false; int mid = min+(target-data[min])/(data[max]-data[min])*(max-min); if (mid <= max || mid >= min) { if (data[mid] == (target)) { flag = true; } else if (data[mid] > (target)) {//中间大于目标 if (min <= mid - 1) { flag = InsertionSearch(data, min, mid - 1, target); } } else if (data[mid] < target) { if (mid + 1 <= max) { flag = InsertionSearch(data, mid + 1, max, target); } } } return flag; }
即也加入一行判断,保证mid不会越界
这个也有人评论了
code
问题2:实验2的代码重构,要求用命令行运行程序,好久没有用Linux,已经忘得差很少了
问题2解决过程:
这个问题在实践截止前也没能解决,由于虚拟机的问题没有在Ubuntu上测试运行
因而在IDEA的命令行上试了好久,百度了不少参考博客,结果都没能成功
后来试了一下基本命令,如新建文件,ls等结果是——找不到命令(手动脸黑)
这真是一个悲伤的故事
百度了一下,应该跟IDEA的命令行相关配置有关
问题3:在Android studio里实现前四个实验的功能,其间遇到了小问题
问题3解决过程:
第一个是将文件复制到Android studio里面时,原先文件里的import引用到这里不能用了,由于AS里已经有一些包结构了
可是手动改的话会累死人的,由于这些查找用到了许多本书前几章的代码,懒得找,,,索性将全部文件都拷过去,因此说一个一个文件的改不现实
因此根据包名,将这几个实验的代码放进相应的包里便可
本次实验让我意识到学过的只是应当多用多回顾,好比说Linux,Android studio,而不能学过就算了