1. 程式人生 > >20172333 2018-2019-1 《程序設計與數據結構》第四周學習總結

20172333 2018-2019-1 《程序設計與數據結構》第四周學習總結

斷開 測試過程 一次 數量 解釋 其他 考試 master 設計

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 《程序設計與數據結構》第四周學習總結