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

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

教材學習內容總結

本週學習的是第十三章

  • 集合與數據結構
    • 集合是一種對象,相似於保存其餘對象的存儲庫。咱們經常使用集合表示一個專用於保存元素的對象,而且該對象還提供增添,刪除等管理
      所保存元素的服務。
    • 集合是同構的,意味着這種集合保存類型所有相同的對象;另外一些集合則是異構的,即這種集合能夠保存各類類型的
      對象。
    • 分離接口與實現:
      一、一個抽象數據類型(ADT)是由數據和在該數據上所實施的具體操做構成的集合。一個ADT有名稱、
      值域和一組容許執行的操做。ADT如何保存數據和執行方法的細節與其概念分離開了。實質上,「集合」和抽象數據類型」是能夠互換的等同概念。
      二、對象具備定義良好的接口,從而成爲一種實現集合的完善機制。
  • 數據結構的動態表示
    html

    • 數組是表示列表的方式之一,但數組在存在期間只能有固定的大小,不是動態的。
    • 動態數據結構的大小規模隨須要增加和收縮。
    • 一個動態數據結構用鏈來實現。
    • 經過保存和更新對象引用來實現一個鏈表的管理。
  • 線性數據結構
    隊列和堆棧
    • 隊列(queue):相似於列表,但隊列元素存取方式有限制,隊列採起先進先出(FIFO)的存取方式,即相似於生活中咱們排隊的狀況,咱們是從隊尾入隊,隊首出隊。
      node

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

    • 圖(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對象,依次類推,最後創建
    起一個鏈表。.net

我覺得我看懂了這句話,理解了鏈的結構,可是當在實現鏈表插入和刪除方法的時候,我才發現其實本身根本就沒有懂。(;´д`)ゞ
那麼鏈表到底怎麼理解呢?還有鏈表和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是雙向鏈表)3d

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

再給你們一篇參考Linked List 鏈表詳解

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

    相對於數組來講:
    優勢: 經過索引(數組下標)能夠很快地訪問數組元素;
    缺點: 插入/刪除元素須要對數組進行調整, 效率低;

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

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

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

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

代碼託管

上週考試錯題總結

  • 錯題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選項的意思是:當一個方法調用本身時,就會發生直接遞歸;間接遞歸發生在有干預方法的時候。
    當時沒有理解什麼是干預方法。
    直接遞歸意味着一個方法直接調用本身,而不使用中間方法。當在原始方法再次被調用以前有一個或多箇中間方法時,就會發生間接遞歸。

此次的題目大可能是考察咱們能不能看懂代碼的邏輯關係,因此此次花費的時間就比較長,由於要一點點理清代碼一步一步要實現的事。此次容易犯錯誤的地方也就是由於邏輯沒有理清,之後本身寫代碼實現遞歸時必定要好好設計。

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • 本週教材的總結比較簡單,可是重點都有總結到。
    • 每次博客中教材的問題都很好,值得學習。
  • 代碼中值得學習的或問題:
    • 過程描述很清楚,問題也很好的解決了。
  • 參考示例

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172309

    • 結對學習內容
      • 實驗三 敏捷開發與XP實踐
      • 教材十三章
  • 上週博客互評狀況

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

時間過得真的很快,一會兒這麼厚的一本課本就翻到了最後一頁。可是「學習本無底,前進莫徬徨。」
但說句實話,我對課本的掌握的仍是很差,因此我必定要好好複習,一有時間就該拿起課本看看,而不該該抱着學完就完事的想法,最後相告訴你們一句話

對世界上的一切學問與知識的掌握也並不是難事,只要鍥而不捨地學習,努力掌握規律,達到熟悉的境地,就能融會貫通,運用自如了。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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

參考資料

相關文章
相關標籤/搜索