20172319 2018.10.12《Java程序設計教程》第6周課堂實踐(補寫博客)

20172319 2018.10.12 《Java程序設計教程》第6周課堂測驗

  • 課程:《程序設計與數據結構》
  • 班級:1723
  • 學生:唐才銘
  • 學號:20172319
  • 指導老師:王志強
  • 日期:2018.10.12
  • 必修/選修:必修

目錄


測試內容

  • 已知線性表具備元素{5,13,19,21,37,56,64,75,80,88,92},若是使用折半查找法,ASL是多少?
    (本題目2分,要求寫出結題過程)

測試要求


實驗步驟

需求分析

  1. 須要瞭解、掌握與折半查找相關的知識
  2. 瞭解ASL是什麼?

代碼實現及解釋

折半查找(二分查找):

  • 相對於線性查找來講效率較高;
  • 要求:被查找元素處在一個項目組中;被查找的元素已經排好順序;
  • 原理:首先先肯定在該存儲結構的中點位置;以後將待查找的值與中值進行比較;若兩者相等,則查找成功並返回此位置,不然肯定新的查找區間,再繼續進行二分查找:
    • 1.若待查找值大於中值,則新的查找區間爲前一查找區間的中值及區間後半部分元素。
    • 2.若待查找值小於中值,則新的查找區間爲前一查找區間的中值及區間前半部分元素。
  • 從初始的查找區間開始,每通過一次與當前查找區間的中點位置上的結點值的比較,便可判斷查找是否成功,不成功則當前的查找區間便縮小一半。這一過程一直重複,直至找到待查找值的位置,或者直至當前的查找區間爲空(即查找失敗)爲止。
public class BinarySearch {
    /*
     * 循環實現二分查找算法arr 已排好序的數組x 須要查找的數-1 沒法查到數據
     */
    public static int binarySearch(int[] arr, int x) {
        int low = 0;   
        int high = arr.length-1;   
        while(low <= high) {   
            int middle = (low + high)/2;   
            if(x == arr[middle]) {   
                return middle;   
            }else if(x <arr[middle]) {   
                high = middle - 1;   
            }else {   
                low = middle + 1;   
            }  
        }  
        return -1;  
    }
    //遞歸實現二分查找
    public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){    
           int midIndex = (beginIndex+endIndex)/2;    
           if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){  
               return -1;    
           }  
           if(data <dataset[midIndex]){    
               return binarySearch(dataset,data,beginIndex,midIndex-1);    
           }else if(data>dataset[midIndex]){    
               return binarySearch(dataset,data,midIndex+1,endIndex);    
           }else {    
               return midIndex;    
           }    
       }   

    public static void main(String[] args) {
        int[] arr = { 6, 12, 33, 87, 90, 97, 108, 561 };
        System.out.println("循環查找:" + (binarySearch(arr, 87) + 1));
        System.out.println("遞歸查找"+binarySearch(arr,3,87,arr.length-1));
    }
}

ASL(Average Search Length :平均查找長度)

  • 衡量查找效率的一個標準。
  • 對於含有n個數據元素的查找表,查找成功的平均查找長度爲:ASL=∑PiCi (i=1,2,3,…,n)。其中:Pi 爲查找表中第i個數據元素的機率,Ci爲找到第i個數據元素時已經比較過的次數,∑Pi=1。html

  • 返回目錄java


程序運行結果及代碼截圖

  • 已知線性表具備元素{5,13,19,21,37,56,64,75,80,88,92},若是使用折半查找法,ASL是多少?
  • 解答:
  • 表中共有11個元素,其中56爲表中間元素的值。
  • 使用二分查找,則:
  • 56須要查找1次;
  • 19及80須要查找2次;
  • 13,21,75,88須要查找3次;
  • 5,37,64,92須要查找4次;
  • 查找的機率相等:1/11;
  • ASL=1/n * ∑Ci = 1/11 * (1 + 2 * 2 + 4 * 3 + 4 * 4) = 33/11 = 3git

  • 返回目錄算法


參考資料

相關文章
相關標籤/搜索