學號 20172326 《程序設計與數據結構》第五週學習總結
教材學習內容總結
查找算法的總結
- 線性查找,經過依次遍歷所要查找元素的集合,比較是否存在所需查找的元素,直到找到該元素或返回false代表集合不存在該元素。實現較爲簡單,==但當集合元素數量巨大時,效率極慢==。
- 二分法查找,經過每次將集合分爲兩部分,比較所需查找的元素位於中間元素的左半區仍是右半區,依次進行二分,直至找到元素,或返回false。效率較高,例如,一個含義一百萬元素的集合,只需20次左右便可完成查找。==但二分法的實現須要基於一個有序數組,不然沒法實現。==
排序算法的總結
- 順序排序——選擇排序法,選擇排序法每遍歷列表依次,找到當前最小元素,將其與列表左側元素交換,最終將全部元素進行排序。
- 順序排序——插入排序法,從最左側元素開始,與其他元素比較,產生一個初步的排序子集,每當下一個比較的元素小於排序子集的最右元素時,通過與子集元素比較,將其插入到子集的順序位置。子集不斷向右與剩餘元素進行比較,直至完成排序。
- 順序排序——冒泡排序,將列表中的元素,從左端開始,兩個元素比較大小,若左大右小,兩個交換位置,一直往復,將最大元素置於最右位置。每次排序都將當前最大的交換到最右
- 快速排序,使用遞歸的思想。以一個元素爲界限,小在左,大在右。而後在進行遞歸,左右繼續剛纔的流程。直到完成排序。其思想與查找中的二分法相似,每次分爲兩部分,進行排序。從而提升效率。
教材學習中的問題和解決過程
<T extends Comparable<? super T>>
中關於 ==?super T== 的理解算法
- 問題2理解:一開始對於這個「?」,我認爲是「非」的意思,但轉念一想,非的符號是!,而且在肯定方法的數據類型時,何談一種非某種數據的數據類型。查閱資料後,獲得了答案,?爲通配符,除了<? super T>外還有<? extends T>兩種。其中前者表示,能夠添加父類以及該父類子類的參數,不能添加其超類。同時,其不能返回其相應數據類型的值,只能返回object對象。而<?extends T>表示,類型的上界,表示參數化類型的多是T 或是 T的子類。
首先,<T extends Comparable
>表示泛型參數應用於該方法,可是,泛型方法並不意味着返回一個泛型數據,而是通過編譯器判斷後,返回一個具體的數據類型的數據。結合起來,總體意識就爲,該方法適用於繼承了Comparable藉口的T方法,其中該參數繼承了泛型類型,但其具體數據類型不明。
代碼調試中的問題和解決過程
- 問題1:pp9-3問題
- 問題1解決方案:pp9-3要求,將各個排序方法的排序時間進行打印,同時,進行對各方法的排序次數進行計數。排序時間使用
System.nanoTime()
便可得出時間。count也將爲簡單,可是,在對歸併法進行統計時出現了問題。歸併法使用了遞歸的思想,因此,當在遞歸方法中進行cout++操做以及System.out.println("the count is :")時,會使每次遞歸都會打印。致使出現數組
the count is :1
the count is :2
the count is 3
the count is :4
the count is :5數據結構
的狀況,那麼可否將count值進行返回呢?顯然是不行的,由於方法均爲void型。那麼索性將void改成int型,而後將其返回,咱們來看一下歸併排序的三個方法函數
public static <T extends Comparable<T>>void mergeSort(T[] data){}
private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max) {}
private static <T extends Comparable<T>> void merge(T[] data, int first, int mid, int last) {}
這裏只截取了三個方法的方法頭,能夠看到,縱使將三個方法改成有返回值型,一個方法與一個方法之間也沒法調用該參數。由於靜態方法沒法使用非靜態參數,除非再將其改成非靜態方法。如此一來,僅僅加一個count計數就將帶來巨大的變化,實非上策。那麼該如何實現呢?其實也很簡單。咱們要在靜態方法裏進行操做,那麼,就不妨在類頭添加一個靜態變量,初始化爲0,然後,一次交換位置,count++,統計時在第一個方法裏直接調用該變量便可。學習
上週考試錯題總結
- 錯題1:The elements of an _____________ have an inherent relationship defining their order.
- 理解:有序列表能夠繼承元素之間的順序,這是由於,有序列表的添加方法中已有排序的方法
- 錯題2:The elements of an ordered list do not have an inherent relationship defining their order.
- 理解:與上一題相似,有序列表即有序線性表在添加元素時就可規定其順序
- 錯題3:Interfaces cannot be derived from other interfaces.
- 理解:Java中不容許一個子類繼承多個父類,但能夠經過實現多個接口來實現相似的形式。
- 錯題4: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.
- 理解:多態性中有這樣一句話: 實際調用的方法版本取決於對象的類型而不是引用變量的類型。
其餘(感悟、思考等,可選)
結對及互評
- 博客中值得學習的或問題:
排版精美,對於問題研究得很細緻,解答也很周全。
- 代碼中值得學習的或問題:
代碼寫的很規範,思路很清晰,繼續加油!
點評過的同窗博客和代碼
參考資料
圖解排序算法(四)之歸併排序
遞歸和非遞歸兩種方式實現二分法查找