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

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

net for循環 記錄 通過 次數 number logs char cti

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

教材學習內容總結

一、隊列概述

  • 概念:列表是使事物以線性的方式進行組織的線性集合。
  • 特點:列表集合的容量可以隨著需要而增大;列表集合可以在列表的中間和末端添加或刪除元素。
  • 分類:列表有有序列表、無序列表和索引列表三種類型。

1.Java集合API中的列表

  • Java集合API提供的列表類主要是支持索引列表
  • Java集合API中提供了使用數組實現的ArrayList類和使用鏈表實現的LinkedList類,它們都可以存儲由泛型參數E定義的元素,同時也都實現了List接口。
  • List接口中的一些方法:
    技術分享圖片
  • 列表ADT:列表ADT中包含的是有序列表和無序列表通用的一些操作,包括:
    • removeFirst:從列表中刪除第一個元素。
    • removeLast:從列表中刪除最後一個元素。
    • remove:從列表中刪除某個元素。
    • first:查看位於列表前端的元素。
    • last:查看位於列表末端的元素。
    • contains:確定列表是否含有某個元素。
    • isEmpty:確定列表是否為空。
    • size:確定列表中的元素數量。
      技術分享圖片

2.有序列表

  • 概念:其元素按照元素的某種內在特性進行排序的列表。
  • 只有Comparable對象才能存儲到有序列表中。
  • 在列表中添加元素
    • 由於有序列表基於元素的某個關鍵值排序,所以對於任何一個要添加進列表的元素,只要給定了元素的關鍵值,它在列表中就會有一個固定的位置。
    • 所以要實現在有序列表中添加元素的操作,只需要設置一個add操作即可。因為在實現該操作時它會自己根據關鍵值的比較來確定在列表的頭部、中部或尾部進行插入。

3.無序列表

  • 概念:其元素按照他們在列表中的位置進行排序的列表。
  • 註意:無序列表雖然叫做“沒有順序的列表”,但並不代表它就是隨機生成的,相反,它其實也是按照某種特殊順序排列的,但這種順序是由使用者來決定的,與元素自身性質無關。
  • 在列表中添加元素
    • 由於無序列表的順序是由使用者決定的,所以要實現無序列表添加元素的操作,需要給使用者提供所有能添加的可能,即addToFront(在列表前端添加)addToRear(在列表末端添加)和addAfter(把元素添加到列表中某元素的後面)三種操作。

4.索引列表

  • 概念:其元素可以用數字索引來引用的列表。
  • 索引列表與無序列表類似,唯一的不同之處是索引列表中的每個元素都能通過一個索引值來得到引用,索引值從0開始
  • 索引列表與數組的區別:當在數組中刪除元素後,其他的元素位置不會發生改變。而在索引列表中刪除元素後,其他的元素位置會產生移動以消除因刪除元素而產生的間隙。

二、用數組實現列表

  • 基於數組實現的列表首先要把列表的一端固定在索引0處,設置一個整數變量rear表示列表中的元素數目,同時表示列表末端的下一個可用位置。
  • remove操作:這個操作用於刪除列表中的指定元素,在一般情況下需要進行數次比較和平移操作,最多的時候(當要刪除的元素是列表的最後一個元素時)需要進行n次比較和平移操作,所以其時間復雜度為O(n)。
    • remove操作使用了一個find操作,其作用是用於查找指定的元素是否存在。將find操作獨立出來的好處有三點:(1)使remove操作變得簡單。(2)find操作同樣可以應用於其他操作,例如contains操作。(3)該方法不會拋出異常,所以調用該方法的程序可以自行定義處理元素未找到時的操作。
  • contains操作:該操作用於判斷指定元素是否在列表中,所以會進行多次比較操作,最多的時候(當所找元素不在列表中時要遍歷整個列表)需要進行n次比較操作,所以其時間復雜度為O(n)。
  • add操作:無論是有序列表的add操作還是無序列表的addToFtont和addAfter操作,都與remove操作類似,需要進行多次比較和平移操作,所以其時間復雜度為O(n)。addToRear操作與棧的push操作類似,時間復雜度為O(1)。

    在隊列中使用環形數組時,可以把dequeue的效率從O(n)變為O(1),因為它不需要平移數組,但是在列表中因為我們可以在任何位置隨意添加刪除元素,所以平移數組的操作無法省略,因此是否使用環形數組就沒有那麽重要了。

三、用鏈表實現列表

  • 使用鏈表實現列表在某些方面與上一章實現的Deque有些類似,很多方法都是相同的。
  • remove操作:鏈表實現的remove操作不需要平移元素,但是這個操作可能會遇到四種情況:列表只有一個元素、刪除列表的首元素、刪除列表的尾元素和刪除列表的中間元素。而在其中仍然存在要進行n次比較操作的情況,因此其時間復雜度也為O(n)。
  • contains操作:鏈表的contains操作需要尋找元素,因此其內容與remove操作十分相似,最開始都要編寫確定目標元素的方法,所以其時間復雜度也為O(n)。

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

  • 問題1:書上有些代碼中提到的instanceof是什麽?怎麽用?
public boolean equals(Object other)
    {
        boolean result = false;
        if (other instanceof Course)
        {
            Course otherCourse = (Course) other;
            if (prefix.equals(otherCourse.getPrefix()) &&
                    number == otherCourse.getNumber()) {
                result = true;
            }
        }
        return result;
    }
  • 問題1解決方案:查JDK無果,網上的解釋是:instanceof是一個簡單的二元操作符,它是用來判斷一個對象是否是一個類實例的。簡單來說它和“==”的作用有些類似,但又不完全一樣,instanceof是存在許多限定條件的,比如說不是隨便兩個類型之間都能用instanceof的,如果兩個操作數的類型都是類,其中一個必須是另一個的子類型。
boolean b1 = new String() instanceof String; 
//b1為true

boolean b2 = "Sting" instanceof Object;
//b2為true,因為String是Object的子類

boolean b3 = new Object() instanceof String; 
//b3為false,Object是父類

boolean b4 = 'A' instanceof Character; 
//編譯不通過,‘A’在此處視為基本數據類型char,instanceof操作符只能用作對象的判斷

boolean b5 = null instanceof String; 
//b5為false,這是instanceof特有的規則:若左操作數為null,結果就直接返回false,不再運算右操作數是什麽類。

boolean b6 = (String)null instanceof String; 
//b6為false,即使類型轉換還是個 null

boolean b7 = new Date() instanceof String; 
//編譯不通過,instanceof操作符的左右操作數必須有繼承或實現關系,否則編譯出錯

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

  • 問題1:在進行數組實現的無序列表測試時,addToFront方法出現錯誤。
    技術分享圖片
  • 問題1解決方法:通過DeBug發現我在for循環裏寫的條件是錯的,導致除了最新加入的元素,其余元素都等於第二個元素。
    技術分享圖片
    這是由於條件的順序問題導致的,將原來的順序變為逆序即可解決問題。
    技術分享圖片
  • 問題2:在進行鏈表實現無序列表的測試中,addAfter總是將所插元素插到指定位置之前而不是之後。
    技術分享圖片
    技術分享圖片
  • 問題2解決方法:問題出在了與target進行比較的元素上面,假如我設定的元素是temp,它指的是用於遍歷鏈表的指針現在所指的節點的下一個節點,當它指向的是所要找的目標元素時,實際要插入的位置(即current指向的節點)是目標元素的前一個,所以最後會導致,addAfter將所插元素插到指定位置之前而不是之後。將與target進行比較的元素改為current即可。
    技術分享圖片
  • 問題3:在使用鏈表實現的列表的removeLast操作和last操作時,彈出NullPointerException
  • 問題3解決方法:作為本學期敲代碼的過程中遇到的次數最多的異常,現在每次看到它我感覺我的內心都是平靜與想摔電腦交織的。因為我在完成這部分的時候參考的是上一章寫過的Deque類,當時它的add和remove都是在一個類中寫的,所以tail會發生改變。但是在列表中remove操作與add操作並不在一個類裏,所以LinkedList類中的tail從開始設定為null之後,如果直接引用的話理所當然要拋出異常。
//原last方法
public T last() throws EmptyCollectionException
    {
        if (isEmpty()){
            throw new EmptyCollectionException("LinkedList");
        }

        return tail.getElement();
    }
    
//修改過的last方法
public T last() throws EmptyCollectionException
    {
        if (isEmpty()){
            throw new EmptyCollectionException("LinkedList");
        }

        LinearNode<T> temp = head;

        T result = temp.getElement();
        while (temp.getNext() != tail){
            temp = temp.getNext();
        }
        tail = temp;
        return tail.getElement();
    }

代碼托管

技術分享圖片

上周考試錯題總結(正確為綠色,錯誤為紅色)

第3章和第4章

  • 錯題1:The implementation of the collection operations should affect the way users interact with the collection.
    • A .true
    • B .false
  • 錯題1解決方法:做題的時候感覺自己是見過這個表述的,但是當時翻書沒有找到,後來在好好看了一遍發現書的37頁和44頁都有提到這句話。的確,假如集合操作在實現的過程中如果影響到交互方式,比如這個方法用鏈表,那個方法用數組,那麽結果可想而知將會是非常雜亂的。
  • 錯題2:An array dynamically grows as needed and essentially has no capacity limitations.
    • A .true
    • B .false
  • 錯題2解決方法:這個題純粹就是手殘點錯了...很生氣自己錯的兩道題都不是什麽難題,錯誤原因也不是知識點沒掌握而是粗心大意,以後要盡量避免這種情況再次發生。

第5章

本章沒有錯題。

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • 優點:代碼編寫時遇到的問題記錄非常詳細。
    • 問題:上周的錯題分析應該有兩次,我的結對夥伴又和上學期一樣忘掉了其中一次的。
  • 代碼中值得學習的或問題:
    • 問題:依舊是commit的問題,本周沒有改進反而顯得更敷衍了...看情況所以代碼是一次commit全部提交的。

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172322
    • 結對學習內容
      • 主要探討了如何用鏈表實現有序列表和無序列表。
      • 相互幫忙解決運行過程中出現的問題。

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

  • 早早結束國慶假期,四號就做到教室裏開始學習,可能因為每天都用很大塊很大塊的時間來學習,所以覺得本周學習的內容並不是很難,學習的過程中還很有樂趣。
  • 非常欣慰的是這回終於記起來在完成作業的過程中遇到問題就及時截圖記錄,不會再像之前明明做的過程中問題不少但是最後總結的時候什麽都想不起來。
  • 可能比起過程我更重視結果吧_(:з」∠)_

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 10/10 1/1 10/10
第二周 246/366 2/3 20/30
第三周 567/903 1/4 10/40
第四周 2346/2712 2/6 20/60
  • 計劃學習時間:20小時

  • 實際學習時間:20小時

  • 改進情況:剛看到本周的代碼量時真的嚇了一跳,能在一個星期左右的時間裏敲兩千行代碼,感覺還是有點厲害的_(:з」∠)_

參考資料

  • Java裏面instanceof怎麽實現的

  • 用鏈表實現3種類型的線性表(有序鏈表、無序鏈表、索引鏈表)

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