20182335 2019-2020-1 《數據結構與面向對象程序設計》第七週學習總結

教材學習內容總結

第12章
算法分析前端

什麼叫作算法:是對特定問題求解方法,或者說是步驟的一種描述。node

什麼叫作好算法(具備如下標準):git

1.正確性程序員

2.可讀性算法

3.健壯性後端

4.通用性數組

5.效率與儲存空間需求數據結構

冰與火之歌:【時間】與【空間】複雜度函數

時間複雜度:在進行算法分析時,語句總的執行次數T(n)是關於問題規模n的函數,進而分析T(n)隨n的變化狀況並肯定T(n)的數量級。學習

算法的時間複雜度,也就是算法的時間量度,記做:T(n)= O(f(n))。它表示隨問題規模的增大,算法執行時間的增加率和f(n)的增加率相同,稱爲算法的漸進複雜度,簡稱爲時間複雜度。
其中f(n)是問題規模n的某個函數。這樣用大寫 O() 來體現算法時間複雜度的記法,咱們稱爲大O記法

第14章

1、棧

棧是一個線性集合,其元素的添加及刪除都在一端進行。棧的處理數據方式爲後進先出,最後入棧的元素最早移出棧,使用棧處理問題聽從反序。

2、鏈式結構
在計算機中用一組任意的存儲單元存儲線性表的數據元素,利用指針能夠對鏈中的各類元素進行添加刪除等操做,比較方便。

3、利用數組實現棧

首先了解數組的幾個關鍵特性:存儲在數組中的元素的下標爲0到n-1,其中n是數組總的單元數。一個數組是一個對象,應該分別對其中所保存的對象進行實例化。設計棧的數組時,棧底總位於數組下標爲0的位置,棧中的元素按序連續保存在數組中。在這個類中定義pop、push、peek、isEmpty等操做。

4、使用鏈實現棧

使用鏈表來實現棧,僅須要一個引用指向表的第一個結點,並瞭解表中的元素個數count,基於棧只容許在一端添加或刪除元素這個屬性,因此只須要在鏈表的一端進行操做。在這個類中也一樣定義push、pop、peek等操做。

第15章

隊列

什麼是隊列:隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端進行刪除操做,而在表的後端進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。(先進先出)

實現隊列

與棧相似:
數組每次被填滿後,加入下一個元素時,把數組拓展成現有數組的兩倍大小。

每次移除元素時,檢測數組空餘空間有多少。當數組裏的元素個數只有整個數組大小的四分之一時,數組減半。

不一樣之處在於:

因爲是先進先出,移除是從隊列的最前端開始的。因此當咱們移除數個數據後,隊列數據是存儲在數組的中間部分的。令隊列數據的尾端數據ID爲Num,首端數據ID爲HeadIndex,則Num - HeadIndex爲隊列數據元素個數。

當隊列數據元素個數爲整個數組空間的四分之一時,數組減半,且隊列數據左移至數組最左端。即Num-=HeadIndex;HeadIndex=0;

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

問題1:什麼是時間複雜度和空間複雜度?

書本內容:增加函數代表問題大小(n)與但願優化的值之間的關係。

我的理解:書上並無詳細介紹時間複雜度與空間複雜度的概念,因此我去查閱了相關資料。時間複雜度是指執行這個算法所須要的計算工做量;而空間複雜度是指執行這個算法所須要的內存空間。通俗講,時間複雜度考慮的就是算法運行的時間,而這是與算法的效率與設計息息相關的。舉例來講,若是有一個多重循環且必須執行到底的算法,那它的時間複雜度必定很高。空間複雜度則顧名思義,考慮的是算法須要佔用的空間、須要佔用計算機資源的多少。

問題2:什麼是泛型?

書本內容:泛型可用於定義一個類,它保存、操做並管理直到實例化時才肯定類型的對象
我的理解:泛型是程序設計語言的一種特性。容許程序員在強類型程序設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須做出指明。各類程序設計語言和其編譯器、運行環境對泛型的支持均不同。

問題3:管理鏈表中,哨兵結點的存在能夠去掉處理第一個結點的特殊情形,哨兵結點的用法是怎麼樣的?

問題3解決方案:我在網上找到了一段介紹哨兵結點的文字:「哨兵節點(sentinel)是一個啞元節點(dummy node),能夠簡化邊界條件。是一個附加的鏈表節點,該節點做爲第一個節點,它的值域中並不存儲任何東西,只是爲了操做的方便而引入的。若是一個鏈表有哨兵節點的話,那麼線性表的第一個元素應該是鏈表的第二個節點。
不少狀況下,須要處理當前節點的前驅節點,若是是沒有哨兵節點的鏈表,對第一個節點,即頭節點,沒有前驅節點。若是不做特殊處理,就可能出錯;若是對它特別對待,就會增長代碼複雜性,還會下降程序效率。而若是有哨兵節點的話, 線性表的每一個位置的節點都有前驅節點,所以能夠統一處理。
當鏈表爲空時,沒有哨兵節點的鏈表的頭節點爲NULL,處理起來也和其餘狀況不一樣。帶哨兵節點的鏈表,當其爲一個空鏈表時,僅含哨兵節點,哨兵節點的指針域爲空,和其餘狀況的表尾是同樣的。」我仍是更傾向於叫他虛位結點,它做爲一個假的首結點,裏面爲空,真正鏈中第一個元素在第二個節點中,對鏈表中首位元素的插入和刪除就能夠在第一個結點和第二個結點之間進行,避免對第一個結點的特殊操做,提升效率。

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

問題1:不清楚LinkedStack中的pop方法。

T result = top.getElement();
top = top.getNext();
count-;

問題1解決方案:結合LinearNode代碼理解,先將top中的元素獲取並賦值給result,返回result,再用LinearNode中的getNext方法獲取下一個元素到top中,這樣實現了彈出元素的操做。

代碼託管(https://gitee.com/li_jinquan/ljq/tree/master/src

https://gitee.com/li_jinquan/ljq/tree/master/

上週考試錯題總結

上週無考試

點評過的同窗博客和代碼

本週結對學習狀況
20182311

感悟

本週事情比較多,學習時間不足,須要及時調整,花更多時間和精力去調整。繼續加油。

參考資料

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

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

相關文章
相關標籤/搜索