20172333 2018-2019-1 《程序設計與數據結構》第四周學習總結
20172333 2018-2019-1 《程序設計與數據結構》第四周學習總結
教材學習內容總結
6.1 列表集合
- 列表集合沒有內在的容量大小,隨著需要而增大
- 列表集合可以在中間和末端添加和刪除元素,區別於隊列和棧只能在末端進行添加刪除。
- 列表集合分為三類:有序列表、無序列表、索引列表
- 有序列表:其元素按照元素的內在特性排序。
- 無序列表:元素只按照它們在列表的位置進行排序。
- 索引列表:元素根據自己的數字索引進行排序。
6.4 Josephus問題
- 列表中的元素每隔i個元素進行提取,直到一個不剩,求最後一個的最初索引是多少即是Josephus問題。
在索引列表中刪除了元素之後,他們的索引會自動補齊,這就是問題所在。
6 Java集合API中的列表
方法 | 功能 |
---|---|
add(E element) | 往列表末端添加一個元素 |
add(int index, E element) | 在指定索引處插入一個元素 |
get(int index) | 返回指定索引處的元素 |
remove(int index) | 刪除指定索引處的元素 |
remove(o objecr) | 替代指定索引處的元素 |
set(int index, E element) | 返回列表中的元素數量 |
6 列表ADT
操作 | 功能 |
---|---|
removeFirst | 從列表中刪除第一個元素 |
removeLast | 從列表中刪除最後一個元素 |
remove | 從列表中刪除某個元素 |
first | 查看位於列表前端的元素 |
last | 查看位於列表末端的元素 |
contains | 確定列表是否含有某個元素 |
isEmpty | 確定列表是否為空 |
size | 確定列表中的元素數量 |
6 數組實現列表
- 由於列表可以在任意位置進行元素的插入與刪除,而數組實現列表的時候,元素需要進行移動。
- 在進行remove操作的時候,如果要刪除的元素是列表的最後一個元素,在這種情況下,需要進行n次比較操作。事實證明,這種刪除操作的實現正好需要n次比較和平移操作,因此該操作的復雜度為O(n)。如果使用的是環形數組實現,他只是提高了刪除第一元素這樣一種特殊情況下的性能。
- 進行contains操作時,由於該方法執行的是列表的線性查找,因此最壞的情況是所查找的元素不在列表中,在這種情況下需要n個比較操作,因而該操作的復雜度為O(n)。
6 鏈表實現列表
- remove操作是鏈表實現列表最重要的一步,該操作包括判斷列表是否為空,查找刪除的元素。並在四種條件下進行刪除(1.被刪除元素為列表中唯一元素。2.被刪除元素是列表中的頭元素。3.被刪除元素是列表中的尾元素。4.被刪除元素在列表的中部位置。)
- 雖然鏈表實現的列表不用進行平移元素來達到坍縮的目的,但是由於要尋找刪除元素,依舊可能需要n次比較操作,所以復雜度依舊為O(n)。
教材學習中的問題和解決過程
問題1:在學習書本上時,看到這麽一句話
- 索引列表的索引值總是連續的。如果刪除了一個元素,其他元素的位置會像"坍縮"了一樣以消除產生的間隙。
那麽這裏的坍縮是什麽意思,指著的是後面的元素會直接消失不見,還是自動補齊呢?
問題1解決方案:百度之後,大致就是後面的元素會自動的補齊索引,畢竟列表的容量是不受限的。
- 問題2:書本上關於數組實現列表remove方法裏面,最後有一行 modcount++的操作,然後書上也沒有具體介紹這個modcount到底是什麽用。
問題2解決方案:在查閱相關資料以及源碼的情況下發現這個int值是為了記錄list數組變化大小的次數,如果次數出現異常,有一個關於modcount的check函數就能調用並產生異常。
圖函數
圖源碼
圖預期情況
代碼調試中的問題和解決過程
問題1:在進行刪除方法的測試過程中,尾部刪除永遠刪不掉東西。
錯誤信息1解決1:在回到刪除方法的檢驗中發現,刪除方法沒有問題,就想到了是不是toString方法出現了差錯,咋一看好像沒啥問題,後來才發現,我把初始化str的步驟放在了循環裏面,導致每一次循環都會初始化一次,這就會導致刪除方法刪掉初始化的那個“”。
圖toString- 問題2:在列表的去尾方法的實現過程中,出現和數組相同的問題,方法使用之後刪除不了末尾的元素。
解決2:剛開始的時候我直接想到toString是否犯了上一次的錯誤,後來看了一下沒有上次的錯誤,就只能檢查方法,由於鏈表刪除全靠指針,我就一直在關註指針,後來研究了很久也沒發現有什麽問題,tail指針也是指向原列表的倒數第二個,按理說直接就會斷開啊,後來詢問了余坤澎後,他說他也遇到了這個問題,而且這個問題是由於我雖然將tail指向了倒數第二元素,但是倒數第二元素還是繼續指向最後一個元素,相當於未脫開,要將它指向null才算完全脫離。手畫圖
代碼托管
-圖代碼
上周考試錯題總結
- 1.A linked implementation of a stack adds and removes elements from the _______ of the linked list.
- A .Front
- B .Rear
- C .Middle
- D .None of the above
- 答案:A。解析:棧類似於放箱子,再拿箱子時要從最上面一個拿即為front.
- 2.A polymorphic reference uses _______________, not the type of the reference, to determine which version of a method to invoke.
- A .the type of the object
- B .the type of the reference
- C .both A and B
- D .none of the above
- 答案:A。解析:多態使用時常常關註的是對象的類型而不是應用的類型。
結對及互評
基於評分標準,我給李楠的博客打分:7分。得分情況如下:
正確使用Markdown語法(加1分)
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, (加3分)
代碼調試中的問題和解決過程, 無問題
感想,體會真切的(加1分)
點評認真,能指出博客和代碼中的問題的(加1分)
點評過的同學博客和代碼
- 本周結對學習情況
- 20172330李楠
- 結對照片
- 結對學習內容
- 集合概述——棧
- 鏈式結構——棧
其他(感悟、思考等,可選)
這個國慶過的還算愉快,除了國慶第一天就享受了七個小時的實驗編程以及倒數三天的Pp編程,還有我最最喜歡的博客- -,在編寫pp的過程中才發現自己有好多的知識點一點也不知道,希望能夠漸漸有那種得心應手的感覺吧。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 0/0 | 1/2 | 10/20 | |
第三周 | 1500/1500 | 1/3 | 10/30 | |
第四周 | 2761/4261 | 2/5 | 25/55 |
《Java程序設計與數據結構教程(第二版)》
- 《Java程序設計與數據結構教程(第二版)》學習指導
大佬一言中的的解釋泛型與object的區別
20172333 2018-2019-1 《程序設計與數據結構》第四周學習總結