實驗三實驗報告

實驗三

實驗項目

項目一

  • 完成教材P302 Searching.Java ,P305 Sorting.java中方法的測試
    很多於10個測試用例,提交測試用例設計狀況(正常,異常,邊界,正序,逆序),用例數據中要包含本身學號的後四位
    提交運行結果圖(可多張)

實驗用例設計以及結果顯示:

  • image
    • 第一張圖片:查找測試中第一個測試用正確,第二個有異常狀況:有兩個可輸出選項只輸出了一個;第三個超出查找邊界,搜索項目裏面不存在查找項。第四個查找目標只給出了一個信息不符合查找條件,異常;第五個給出了多餘信息,可是Searching類排除了這個多餘信息,並未將之做爲查找條件正確。
  • image
    • 第二張圖片:測試用例1,2分別是正序和倒序排列好的整數數組,用選擇排序和插入排序測試輸出正常正序結果。測試用例3是亂序整數數組,冒泡排序測試正常。
  • sS4pQ.md.png
    • 第三張圖片:測試用例4定義了String類型數組,未實現comparable接口,沒法調用campareTo方法,拋出異常;
  • sS5lj.png
    • 第四張圖片:測試用例5輸入的mergeSort參數超過邊界拋出異常;
  • sSI6s.png
    • 第五張圖片:對測試用例1selectionSort方法修改輸出逆序結果。

實現過程以及收穫:

  • 在實現排序逆序輸出時我只測試了一個算法,把選擇排序算法裏的capareTo方法的比較結果調成了交換後數值大的在前面先輸出了。
for (int scan = index+1; scan < data.length; scan++)
                if (data[scan].compareTo(data[min]) >0)
                    min = scan;
            swap (data, min, index);
  • 在本實驗的實現過程當中沒有遇到什麼困難。在查找中設計的第二個測試實例檢測出了程序設計中的不足之處:當查找內容有與target相同內容的兩個不一樣項目時,只能輸出先查找到的結果,可是這樣確實減小了查找的用時。在使用該方法前剔除查找條件重複項便可。

項目二

  • 重構你的代碼
    把Sorting.java Searching.java放入 cn.edu.besti.cs1623.(姓名首字母+四位學號) 包中
    把測試代碼放test包中
    從新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)html

  • s9IZq.png

實現過程以及收穫:

  • 我在創建了要求的包以後把全部代碼移了進去,調整了部分方法的import引用的位置以後就能夠正常運行了,移動時IDEA自動進行了package,因此不須要我手動從新打包。
    參考 http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試
    提交運行結果截圖

項目三

實驗結果顯示:

  • siuRS.png
  • siXQg.png
  • 其餘的幾個查找方法在未查找目標的時候都會輸出null,在二叉樹查找裏面我沒有加入這個輸出結果。因此額外加上了不在範圍內的162315的查找,輸出ElementNotFound異常。java

    實現過程以及收穫:

  • 插入查找我使用了參考資料裏面的遞歸的算法,並對它進行了必定的修改,最後把輸出結果也改爲了輸出查找項,而不是原代碼中的位置。
  • 最開始徹底不知道斐波拉契算法查找是什麼,後來讀了資源博客和百度上的一些博客才知道:算法

    斐波那契查找與折半查找很類似,他是根據斐波那契序列的特色對有序表進行分割的。他要求開始表中記錄的個數爲某個斐波那契數小1,即n=F(k)-1;
    開始將k值與第F(k-1)位置的記錄進行比較(及mid=low+F(k-1)-1),比較結果也分爲三種
    • 1)相等,mid位置的元素即爲所求數組

    • 2)> ,low=mid+1,k-=2;說明:low=mid+1說明待查找的元素在[mid+1,hign]範圍內,k-=2 說明範圍[mid+1,high]內的元素個數爲n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1個,因此能夠遞歸的應用斐波那契查找測試

    • 3)< ,high=mid-1,k-=1;說明:low=mid+1說明待查找的元素在[low,mid-1]範圍內,k-=1 說明範圍[low,mid-1]內的元素個數爲F(k-1)-1個,因此能夠遞歸的應用斐波那契查找。命令行

    可是對於如何實現仍是一頭霧水,最後我修改了嵌入了網上的一個代碼。
  • 二叉樹查找的實現較爲容易,我直接調用了二叉查找樹的find方法實現了。
/*調用二叉查找樹的find方法*/
public int LinkedBinaryTreeSearch(Integer LinkedBinarySearchTree,Integer target) throws ElementNotFoundException {
    LinkedBinarySearchTree sear=new LinkedBinarySearchTree();
    Integer result= (Integer) sear.find(target);
    return result;
}
  • 分塊查找我在網上讀了一些介紹:大體總結了如下關鍵點:
    • 1)把查找的表分爲幾個塊(block)。
    • 2)每一個塊內部沒有明確的順序,可是上一個塊的最大元素要大(小)於下個塊的最小元素。
    • 3)分塊查找的核心在於根據每一個塊的表明元素(最大(小)的元素)肯定查找元素的位置,從而減少複雜度和提升效率。
    • 4)在肯定的塊內尋找目標元素。

    根據以上要點我設計了一個比較簡單的分塊查找算法,實現過程爲:首先規定查找表的大小在10到12之間。將其排序輸出分爲以4爲塊容量劃分。首先比較查找目標與塊間的最大最小元素來肯定元素所在的塊,在在塊內部直接查找獲得結果。算法的核心是肯定目標所在塊:設計

    for (int i=0;i<4;i++){
          First[i]=data[i];
    
      }
          for (int i=0;i<4;i++){
              Second[i]=data[i+4];
    
          }
              for (int i=0;i<data.length-8;i++){
              Third[i]=data[i+8];
    
              }
              if (target<=First[3]){
                  int index=0;
                 while (result == null && index< First.length)
                  {
                      if (First[index]==target)
                          result = First[index];
                       index++;
                  }
    
              }
          if (target>=First[3]&&target<=Second[3]){
              int index=0;
              while (result == null && index< Second.length)
              {
                  if (Second[index]==target)
                      result = Second[index];
                  index++;
              }
    
          }
          if (target>=Second[3]&&target<=Third[Third.length-1]){
              int index=0;
              while (result == null && index< Third.length)
              {
                  if (Third[index]==target)
                      result = Third[index];
                  index++;
              }
          }else if (target<First[0]||target>Third[Third.length-1]){
              result=null;
          }

    若是要將它升級成一個能實現大規模查找的算法的話,塊的容量要根據目標表的容量來定了。3d

項目四

補充實現課上講過的排序方法:希爾排序,堆排序,桶排序,二叉樹排序等
測試實現的算法(正常,異常,邊界)
提交運行結果截圖
推送相關代碼到碼雲上code

實驗結果顯示

  • sZree.png

實現過程以及收穫

  • 希爾排序跟書上給出的大多數操做都是交換算法的排序算法有點不一樣,它是經過比較較遠間隔的元素將它們排序,而後減小比較元素的間距距離爲1(相鄰元素時爲止)時完成排序
相關文章
相關標籤/搜索