20172301 《Java軟件結構與數據結構》實驗三報告

20172301 《Java軟件結構與數據結構》實驗三報告

課程:《Java軟件結構與數據結構》
班級: 1723
姓名: 郭愷
學號:20172301
實驗教師:王志強老師
實驗日期:2018年11月20日
必修/選修: 必修php

一.實驗內容

實驗一

實驗二

實驗三

實驗四

實驗五

二.實驗過程及結果

實驗一:

實驗一是比較簡單的,代碼是書上的代碼。主要是Junit測試由於很久沒有用過,老是會有一些錯誤,相似junit測試方法前沒有添加test,或者junit測試的assert方法實現。
測試用例設計狀況(正常,異常,邊界,正序,逆序),關於測試用例,對於排序的異常,是ClassCastException,是轉換髮生了錯誤。具體是例如1234ab是不能夠比的,也就是不能排序。

排序應該是沒有邊界測試的。html

對於查找的異常,是ArrayIndexOutOfBoundsException,是數組越界。即查找範圍超過了數組範圍。

查找應該是沒有逆序測試的。java

  • 實驗一測試結果截圖:
    查找測試:

    排序測試:

    web

  • 藍墨雲連接算法

實驗二:

實驗二首先要移到包裏面,須要注意的是測試類的位置,須要放在項目的test文件夾中,而且變動目錄爲Test Sources Rootwindows

實驗三:

七種查找算法分別是:線性查找、二分查找、插值查找、斐波那契查找、樹表查找、分塊查找、哈希查找。以前的學過的查找方式,這裏就再也不多說了。
須要注意的是,插值查找斐波那契查找都是二分查找的優化,因此他們所查找的序列應該也是有序的。數據結構

我重點解釋一下分塊查找。
在以前的學習中,咱們學習過度塊排序。那麼類比推理一下,分塊查找的原理應該也是相似的。分塊查找的最大特色就應該是塊內無序,塊間有序。 經過這個特色,咱們能夠首先能夠肯定目標元素在哪一個塊裏面,而後經過順序查找肯定其位置。
能夠說,是一種折半查找和順序查找的優化改進的方法。函數

那麼這裏,我直接用了以前的分塊方法。

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 (voiddest, 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]);
       }

其餘(感悟、思考等)

  • 這周作完實驗沒有及時總結,由於時間比較久遠,致使有一些錯誤和解決方法都有所遺忘。部分參考資料仍是在瀏覽器的歷史記錄中淘到的。之後要對錯誤及時總結,養成良好的學習習慣。

參考資料

相關文章
相關標籤/搜索