20172332 2017-2018-2 《程序設計與數據結構》第五週學習總結

20172332 2017-2018-2 《程序設計與數據結構》第五週學習總結

教材學習內容總結

第九章 排序與查找html

查找

  • 1.查找:是一個過程,有兩個做用:①肯定該組中是否存在該目標元素。②在某個項目組(查找池)中尋找某一指定目標元素。
  • 2.查找算法:①線性查找。②二分查找。爲了高效的完成查找,須要最小化比較操做的次數,與查找池中項目的數目息息相關。
  • 3.爲了查找到某個對象,須要進行比較對象的操做,所以所涉及的元素實現了Comparable接口。
  • 4.有一個Searching類,全部的排序和查找方法都將位於這個類中。可是這個類使用時必須先實例化,對只含有方法而無其餘內容的類很不方便,所以須要把全部方法聲明爲靜態或泛型的。
  • 5.靜態方法(類方法):不須要實例化能直接使用的方法,用static修飾符修飾。
  • 6.泛型方法:建立一個引用泛型的方法,泛型參數只應用於該方法。
  • 7.建立泛型方法的方法:只需在方法頭的返回類型前插入一個泛型聲明便可。其格式是:修飾符 <類型參數列表> 返回類型 方法名(形參列表) { 方法體 }。例如:
    `public static <T, S> int func(List list, Map<Integer, S> map) { ... }
    泛型聲明必須在返回類型以前
  • 8.線性查找法:從一端開始依次按順序搜索查找池,直至另外一端。
  • 9.二分查找法(折半查找法):查找池中的項目組已排序,效率比線性查找法高的多。
  • 10.有關二分查找法的相關內容以及ASL的計算方法
  • 11.查找算法的比較:二分查找具備一個對數算法且具備時間複雜度O(log2n),線性查找具備線性時間複雜度O(n),所以二分查找要快的多。可是線性查找的代碼實現比二分查找的簡單而且線性查找不須要把查找池中的項目組先排序,剩下了額外成本。
  • 12.n越大,二分查找越適用。

補充知識:

  • 13.分塊查找:是折半查找和順序查找的一種改進方法,分塊查找因爲只要求索引表是有序的,對塊內節點沒有排序要求,所以特別適合於節點動態變化的狀況。分塊查找要求把一個大的線性表分解成若干塊,每塊中的節點能夠任意存放,但塊與塊之間必須排序。
  • 14.分塊查找步驟:①先選取各塊中的最大關鍵字構成一個索引表;②查找分兩個部分:先對索引表進行二分查找或順序查找,以肯定待查記錄在哪一塊中;而後,在已肯定的塊中用順序法進行查找。java

  • 15.哈希表
  • 16.平方取中法
  • 17.摺疊法
  • 18.除留餘數法:用關鍵字k除以不大於散列表長度的數m所得餘數做爲哈希地址,即H(k)= k % m。(須要注意m的選取,避免產生衝突,不容易產生同義詞)。裝填因子α最好在0.6~0.9之間,m最好去1.1n~1.7n之間的一個素數,n爲散列表中元素個數。
  • 19.解決衝突的方法:
    • ①開放定址法:【(1)線性探測再散列。(2)二次探測再散列。(3)僞隨機探測再散列。】查找時若發現有衝突,須要判斷用的什麼方法,按照方法步驟繼續查找。
    • ②再哈希(再找一個哈希函數)。
    • ③鏈地址法(運用鏈表,把同義詞傳在一塊兒,掛在相應的地址下)。查找時就用鏈表查找操做。

排序

  • 1.排序:是一個過程,基於某一標準或升序或降序按某個規定的順序排列。
  • 2.排序算法:①順序排序。②對數排序。與查找算法同樣,在n較小時兩類算法間的差異較小。
  • 3.順序排序:①選擇排序法。②插入排序法。③冒泡排序法。
  • 4.對數排序:①快速排序法。②歸併排序法。
  • 5.選擇排序法:掃描整個列表找出最小值,將這個值與該列表第一處交換,再掃描剩下的列表找出最小值,將它與整個列表的第二處交換,以此類推。(代碼須要用一個temp變量暫時存儲最小值)git

  • 6.插入排序法:經過反覆地將某一特定值插入到該列表某個已排序的子集中來完成對列表值的排序。也就是先比較第一個數和第二個數,把第一個數和第二個數排好序以後,把第三個數與已排好的第一個數和第二個數進行比較而後插入進合適的位置,依此類推排完列表中的全部數。
  • 7.冒泡排序法:經過重複比較列表中的相鄰元素,並在它們彼此不符順序時將它們互換來完成對值的排序。也就是先把最大或最小的數放在恰當位置,以後再冒泡出倒數第二個值。
  • 8.快速排序法:經過使用一個任意選定的分區元素將該列表分區,而後對分區元素的任一邊的子列表進行遞歸排序。
  • 9.歸併排序法:經過將列表遞歸式分紅兩半直至每一子列表都只含有一個元素,而後將這些子列表按順序重組。(如果奇數,則分解是後面比前面多一個。)算法

  • 10.基數排序法:基於排序關鍵字(排序基於某個特定的值)的結構。(就是先建立基數的隊列,而後把數放進相應的隊列中,經過不斷的遍歷找到最後的位置)數組

  • 11.基數:排序關鍵字的可能取值的個數(也就是每種排序關鍵字都會單首創建一個隊列,最後的隊列個數)。數據結構

教材學習中的問題和解決過程

  • 問題1:<T extends Comparable > 和 <T extends Comparable<? super T>> 有什麼不一樣
  • 問題1解決方案:函數

  • 總結一下就是<T extends Comparable<? super T>>T的實例類型更多了,包括了父類。學習

  • 問題2:快速排序法的具體步驟是什麼?到底怎麼排序?
  • 問題2解決方案:1.先從數列中取出一個數做爲基準數。2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3.再對左右區間重複第二步,直到各區間只有一個數。測試

  • 問題3:這行代碼的意思是什麼?做用是什麼?.net

  • 問題3解決方案:java.lang.Character.digit(char ch, int radix)方法,在指定的基數返回字符ch的數值。這行代碼是爲了確保所得到的這個數是在基數範圍內。在書上的代碼中,也就是爲了確保數字是在0-9之間。

  • 問題4:裝填因子是什麼?怎麼計算?
  • 問題4解決方案:裝填因子越大,越不容易產生衝突。裝填因子 = 散列表元素個數/哈希表長度

代碼調試中的問題和解決過程

  • 問題1:明明data是泛型數組知足swap方法的形參形式,爲何會紅?

  • 問題1解決方案:由於selectionSort方法用的是<T extends Comparable<? super T>>,保持統一swap方法也應該是<T extends Comparable<? super T>>。

  • 問題2:怎麼計算程序的執行時間。
  • 問題2解決方案:
1 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
2 System.out.println(df.format(new Date()));// new Date()爲獲取當前系統時間
  • Java 獲取並計算程序執行時間,有如下兩種方法:

(1)以毫秒爲單位計算
static long currentTimeMillis() , 該方法返回值是從1970年1月1日凌晨到此時刻的毫秒數

1 long startTime=System.currentTimeMillis();   //獲取開始時間
2 doSomeThing();  //測試的代碼段
3 long endTime=System.currentTimeMillis(); //獲取結束時間
4 System.out.println("程序運行時間: "+(end-start)+"ms");

(2)以納秒爲單位計算

1 long startTime=System.nanoTime();   //獲取開始時間
2 doSomeThing();  //測試的代碼段
3 long endTime=System.nanoTime(); //獲取結束時間
4 System.out.println("程序運行時間: "+(end-start)+"ns");
  • 問題3:列表已經排序好了,爲何還有比較次數?並且次數還不相同?

  • 問題3解決方案:須要進行比較,才能知道是否排序好了,不一樣的排序方法,須要比較的次數不一樣。

  • 問題4:PP9.2所寫的類形參是T[] data,在測試類中若是直接用int[],是不行的。

  • 問題4解決方案:T[] 是針對對象而言的,因此若是想直接放入數字,那麼須要用Integer[]來實現。

代碼託管

上週考試錯題總結

  • 無錯題。

點評過的同窗博客和代碼

其餘(感悟、思考等,可選)

  • 這周的內容不少而且也比較重要,新的知識較多,花費了大量時間去學習,我以爲這周是開學到至今學的最認真的一週了。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 2/2
第二週 1010/1010 1/2 10/12
第三週 651/1661 1/3 13/25
第四周 2205/3866 1/4 15/40
第五週 967/4833 2/6 22/62
  • 計劃學習時間:30小時

  • 實際學習時間:22小時

  • 改進狀況:這周的內容是真的多。並且很是重要,雖然原理簡單,可是代碼實現起來仍是有必定難度的。

參考資料

相關文章
相關標籤/搜索