課程:《程序設計與數據結構》
班級: 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,而不能學過就算了