1. 程式人生 > >20172320 2018-2019-1 《Java程式設計》第五週學習總結

20172320 2018-2019-1 《Java程式設計》第五週學習總結

20172320 2018-2019-1 《Java程式設計》第五週學習總結

教材學習內容總結

查詢

查詢是一個在某個專案中尋找某一指定元素或者確定某一指定目標不存在的過程,對其進行查詢的專案組有時也稱為查詢池
高效的查詢會使該過程所做的比較操作次數最小化

1、線性查詢法

  • 從表頭開始依次比較,直到找到目標或確定目標不存在
  • 該方法容易理解但不是特別高效,唯一的條件是必須能夠依次考察每一個元素,時間複雜度O(n)
  • 最好的情形是目標元素剛好是我們所考察的第一個專案,最壞的目標不存在,且在考察完所有元素後才能確認
    2、二分查詢法
  • 二分查詢從列表的中間開始查詢,每次查詢會刪除一半的可行後選項
  • 二分查詢普遍要快得多,二分查詢具有一個對數演算法,時間複雜度O(log2 n)
  • 二分查詢對於大型查詢池非常有效率
    3、比較
  • 線性查詢比較簡單,程式設計和除錯比較容易,對於小型問題兩者幾乎沒差距,隨著n的變大,二分查詢會比較有效率

    排序

    排序是基於某一標準,將某一個專案按照某個規定順序排列,通常分為順序排列(比較n^2次)和對數排列(比較nlog2n次),n較小時這兩類演算法之間幾乎不存在實際差別
    1、選擇排序,插入排序
    2、氣泡排序
  • 通過重複比較相鄰元素且在必要時互換,從而完成排序。將最大值“冒泡”到最後,然後再次掃描,重複該過程,直到所有元素冒泡到正確的位置,一共進行n-1輪

    3、快速排序法
  • 將列表進行分割槽,然後對分割槽進行遞迴式排序。先選擇一個列表元素作為分割槽元素,然後分割列表,使小於分割槽元素的元素位於該元素的左邊,剩下的位於右邊,最後再將該方法應用於兩分割槽

    4、歸併排序
  • 演算法通過將列表遞迴分成兩半直至每一子列表都含有一個元素,然後將這些子列表歸併到一個排序順序中
    分為分解、合併兩步

教材中遇到的問題和解決過程

  • 選擇排序和氣泡排序,插入排序的比較
  • 這些演算法都是O(N2)的時間級別,但插入排序演算法比冒泡快一倍,比選擇排序略快一點
    氣泡排序:比較 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N^2/2

       交換 0——N^2/2 = N^2/4

       總時間 3/4*N^2

  選擇排序:比較 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N^2/2

       交換 0——3(N-1)=3(N-1)/2=3/2*N

       總時間 N^2/2+3/2*N

  插入排序:第一輪最多比較一次,第二輪最多比較倆次,最後一輪比較N-1次,所以最多比較N*(N-1)/2。

       複製的次數和比較的次數大致相等,但是複製消耗的時間比交換要小.

       比較 0——N(N-1)/2=N(N-1)/4=N^2/4

       複製 0——N(N-1)/2=N(N-1)/4=N^2/4

       總時間 N^2/2
氣泡排序每次比較相鄰的兩個元素進行排序,而選擇排序演算法先並不急於調換位置,先從A[1]開始逐個檢查,看哪個數最小就記下該數所在的位置P,等一躺掃描完畢,再把A[P]和A[1]對調,就把最小的放在了最前面,選擇排序每掃描一遍陣列,只需要一次真正的交換,而冒泡可能需要很多次

程式碼除錯中的問題和解決過程

  • 問題1:pp9.3如何計算程式執行時間
  • 解決方案:找到兩種,currentTimeMillisnanoTime,分別以毫秒和納秒為單位計算,虛擬碼如下
long startTime=System.currentTimeMillis();   //獲取開始時間
 
doSomeThing();  //測試的程式碼段
 
long endTime=System.currentTimeMillis(); //獲取結束時間
 
System.out.println("程式執行時間: "+(end-start)+"ms");
 
//虛擬碼
 
long startTime=System.currentTimeMillis();   //獲取開始時間
 
doSomeThing();  //測試的程式碼段
 
long endTime=System.currentTimeMillis(); //獲取結束時間
 
System.out.println("程式執行時間: "+(end-start)+"ms");
long startTime=System.nanoTime();   //獲取開始時間
 
doSomeThing();  //測試的程式碼段
 
long endTime=System.nanoTime(); //獲取結束時間
 
System.out.println("程式執行時間: "+(end-start)+"ns");
 
//虛擬碼
 
long startTime=System.nanoTime();   //獲取開始時間
 
doSomeThing();  //測試的程式碼段
 
long endTime=System.nanoTime(); //獲取結束時間
 
System.out.println("程式執行時間: "+(end-start)+"ns");

錯題分析

  • Interfaces allow us to make ____________ references, in which the method that is invoked is based on the particular object being referenced at the time.
    A .Polymorphic
    B .Multiple
    C .Interface
    D .None of the above
    分析:A
    介面允許我們建立多型引用,在這種情況下,被呼叫的方法基於當時被引用的特定物件
  • Interfaces allow us to make polymorphic references, in which the method that is invoked is based on the type of the reference variable rather than the particular object being referenced at the time.
    A .True
    B .False
    分析:B
    介面允許我們進行多型引用,在這種引用中,被呼叫的方法基於引用變數的型別,而不是當時引用的特定物件

    託管程式碼

    結對及互評

點評過的同學部落格和程式碼

  • 本週結對學習情況
    20172327
  • 結對學習內容
    •閱讀第9章節,執行教材上的程式碼
    •完成程式設計專案PP9.2、PP9.3
    •完成課後自測題,並參考答案學習

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/2 20/20
第二週 328/328 1/3 20/40
第三週 1597/ 1925 1/4 20/60

參考資料