1. 程式人生 > >20172310 2017-2018-2 《程序設計與數據結構》第十周學習總結

20172310 2017-2018-2 《程序設計與數據結構》第十周學習總結

直接 rap rst 人的 有一個 開始 git 類的方法 非線性

20172310 2017-2018-2 《程序設計與數據結構》第十周學習總結

教材學習內容總結

本周學習的是第十三章

  • 集合與數據結構
    • 集合是一種對象,類似於保存其他對象的存儲庫。我們常用集合表示一個專用於保存元素的對象,並且該對象還提供增添,刪除等管理
      所保存元素的服務。
    • 集合是同構的,意味著這種集合保存類型全部相同的對象;另一些集合則是異構的,即這種集合可以保存各種類型的
      對象。
    • 分離接口與實現:
      1、一個抽象數據類型(ADT)是由數據和在該數據上所實施的具體操作構成的集合。一個ADT有名稱、
      值域和一組允許執行的操作。ADT如何保存數據和執行方法的細節與其概念分離開了。實質上,“集合”和抽象數據類型”是可以互換的等同概念。
      2、對象具有定義良好的接口,從而成為一種實現集合的完善機制。
  • 數據結構的動態表示
    技術分享圖片

    • 數組是表示列表的方式之一,但數組在存在期間只能有固定的大小,不是動態的。
    • 動態數據結構的大小規模隨需要增長和收縮。
    • 一個動態數據結構用鏈來實現。
    • 通過保存和更新對象引用來實現一個鏈表的管理。
  • 線性數據結構
    隊列和堆棧
    • 隊列(queue):類似於列表,但隊列元素存取方式有限制,隊列采取先進先出(FIFO)的存取方式,即類似於生活中我們排隊的情況,我們是從隊尾入隊,隊首出隊。
      技術分享圖片

    • 堆棧(stack):堆棧類似於隊列,不同之處在於元素的存取方式,它是采用後進先出(LIFO)的存取方式,也就是堆棧元素在堆棧的同一端進入和移出棧堆,最後進入的是第一個移出的。
      技術分享圖片
  • 非線性數據結構
    樹和圖
    • 樹(tree):是一個非線性數據結構,由一個節點和構感層次結構的多個節點組成(除根節點外的所有節點稱為內部節點,沒有子節點。
      註意,要由上至下地一棵樹,根節點在頂層,葉節點在底層。
      重點概念:樹是一種以層次結構組織數據的非性數據結構
    • 二叉樹(binary tree)上,每個節點不能有超過兩個的子節點。
      技術分享圖片

    • 圖(graph):圖沒有類似於樹根節點那樣的初始入口點。在一個圖中,一個節點到另一個節點的連接稱為邊,連接一個圖內各節點的邊數一般沒有限制。
      技術分享圖片技術分享圖片

數據結構_非線性結構_圖

  • Java集合類API
    • Java集合類API是Java標準類庫中的一組類,代表不同類型的集合體,在這組類中,大多數的類名表明了集合類型及其基本實現方法。如ArrayList和LinkedList。-
    • 泛型:Java集合類API中定義的類定義為泛型,是指一個集合所管理的對象的類型要在實例化時該集合對象時才能確定。
    • 泛型保證了集合中對象類型的兼容性。
    • 在建立集合時,如果沒有指定該集合中可能存放的對象的類型,則將默認定義為Object類型,即該集合可以存放任何類型的對象。
      技術分享圖片

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

  • 問題1:為什麽對象特別適於實現抽象數據類型?我看到這個問題的時候覺得我可能對“對象”這個概念的理解還是不夠充分。
  • 問題1解決方案:之前理解的是:類就是具備某些共同特征的實體的集合,它是一種抽象的數據類型,它是對所具有相同特征實體的抽象。在面向對象的程序設計語言中,類是對一類“事物”的屬性與行為的抽象。
    對象就是一個真實世界中的實體,對象與實體是一一對應關系的,意思就是現實世界的每一個實體都是一個對象,所以對象是一個具體的概念。
    類是對象的集合,對象是類的實例;對象是通過new className產生的,用來調用類的方法;類的構造方法 。
    這個理解是對的,但是我沒有看到他背後更根本的實現的方式。
    ADT是一個包含數據和施加在這些數據類型上的操作的集合。對象實際上就是將相關變量和相關方法封裝在一起的實體。對象隱藏了ADT背後的實現細節,並且將接口和底層的實現相分離,使得實現發生變化後並不影響接口。

  • 問題2:class Node { int info; Node next; }

    實例化兩個Node對象,並使一個Node對象的變量next指向另一個Node對象,從而將兩
    個對象鏈接在一起。第二個對象的引用變量next又可指向更三個Node對象,依次類推,最後建立
    起一個鏈表。

我以為我看懂了這句話,理解了鏈的結構,但是當在實現鏈表插入和刪除方法的時候,我才發現其實自己根本就沒有懂。(;′д`)ゞ
那麽鏈表到底怎麽理解呢?還有鏈表和LinkedList有什麽關系呢?用鏈表來進行數據管理有什麽好處呢?

  • 問題2解決方案:

    • 對於第一個問號:我再好好看了好幾遍課本上的例子,覺得之前我沒有理解的關鍵就是沒有弄懂指針和next的概念。鏈表是相同類型的若幹個結構體用其自身攜帶的指針(指針只是起一個指示的作用,我的理解就是表明現在的節點在什麽位置,接下來的操作是在什麽位置進行的)按照一定順序串聯成的一個鏈。舉個簡單例子進行類比:structnode{inta;structnode*next;};把這個鏈表節點的結構體structnode看作是人,結構體內的next指針看作是人的一只手,這只手只能用於指向人(別人或自己)。如果有多個人排成一排,每個人都舉起右手指向右邊的人,就形成一個人組成的鏈表。
    • LinkedList類(鏈接列表)
      LinkedList實現了List接口,允許null元素。但除了有List中所有方法以外,還有get,remove,insert以及最開頭元素和最結尾元素等方法,而這些方法使得LinkedList既能當stack,queue和double-end queue(Deque)。
      LinkedList是將每個對象存放在獨立的內存空間中,而且,每個空間中還保存有下一個鏈接的索引(如果是雙向鏈表,那麽它還保存了上一個鏈接的索引。Java是雙向鏈表)

對順序訪問進行了優化,向List中間插入與刪除得開銷不大,隨機訪問則相對較慢(因為LinkedList是必須從頭開始搜索,可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast(),linkedList也是不同步的。

再給大家一篇參考Linked List 鏈表詳解

  • 鏈表是一種動態結構,通常是將它與靜態的數組相比較

    相對於數組來說:
    優點: 通過索引(數組下標)可以很快地訪問數組元素;
    缺點: 插入/刪除元素需要對數組進行調整, 效率低;

而鏈表:
優點:插入/刪除速度很快,而且不用對整個鏈表進行調整;
缺點:只能進行順序訪問,不能隨機訪問(像數組一樣用下標)。

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

  • 問題1:在實現鏈表的刪除和插入的方法時我遇到了這樣一個問題,就是插入和刪除後鏈表剩下的就只有插入的數據或是變成了空的。
    (截圖被我弄丟了o(╥﹏╥)o)
  • 問題1解決方案:感謝我的隊友的幫助,發現自己是因為在寫紅框中的循環條件的時候用的是index > 0
    (這是現在正確代碼的截圖)
    技術分享圖片

又給了我一個小經驗,一定註意循環的條件要好好設計。

  • 問題2:XXXXXX
  • 問題2解決方案:XXXXXX

代碼托管

技術分享圖片

上周考試錯題總結

  • 錯題1及原因,理解情況
    技術分享圖片

如果J等於a的長度,返回false;如果j=b的長度而不等於a的長度,返回true;既不等於a的長度,又不等於b的長度,則調用遞歸計算(a,b,j+1)。我當時的判讀是反了的,應該是只有當a的長度大於b的長度時,才會返回true。

  • 錯題2及原因,理解情況
    技術分享圖片

遞歸的情況是用相同的參數調用自己的方法,所以n不會改變,因此如果(n-0)最初是正確的,它仍然是正確的。但當n>0時,永遠不可能為基本情況。邏輯我是理解的,但是給出的選項沒有理解好。

  • 錯題3及原因,理解情況
    技術分享圖片
    A選項的意思是:當一個方法調用自己時,就會發生直接遞歸;間接遞歸發生在有幹預方法的時候。
    當時沒有理解什麽是幹預方法。
    直接遞歸意味著一個方法直接調用自己,而不使用中間方法。當在原始方法再次被調用之前有一個或多個中間方法時,就會發生間接遞歸。

這次的題目大多是考察我們能不能看懂代碼的邏輯關系,所以這次花費的時間就比較長,因為要一點點理清代碼一步一步要實現的事。這次容易犯錯誤的地方也就是因為邏輯沒有理清,以後自己寫代碼實現遞歸時一定要好好設計。

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分:XX分。得分情況如下:xxx

  • 參考示例

點評過的同學博客和代碼

  • 本周結對學習情況
    • 20172309

    • 結對學習內容
      • XXXX
      • XXXX
  • 上周博客互評情況
    • 20172309
    • 20172310

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

xxx
xxx

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 127/127 1/1 25/25
第二周 278/405 1/2 20/45
第三周 442/847 1/3 20/65
第四周 1063/1910 2/5 30/95
第五周 840/2750 1/6 27/122
第六周 631/3381 1/7 20/142
第七周 914/4295 1/8 20/162
第八周 2534/6829 2/10 30/192
第九周 252/7081 3/13 26/218
第十周 630/7711 1/14 27/245

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導

  • 數據結構_非線性結構_圖

20172310 2017-2018-2 《程序設計與數據結構》第十周學習總結