2020—2021—1學期20202405《網路空間安全導論》第四周學習總結

20202405李昕亮發表於2020-10-31

2020—2021—1學期20202405《網路空間安全導論》第四周學習總結

學習內容:《電腦科學概論》第8、9章


週五聽了課後又一次認真讀了教材,鞏固了第六章、第七章的學習,這個週末我就開啟了第八章第九章的學習。

第八、九章是《電腦科學概論》的第四部分——程式設計層的第二個小部分。上節課謝老師說,第六章到第九章是本書的核心內容,對日後的學習有很大的幫助,必須經常翻書看一看,才能有所收穫,所以這兩章的重要性自然不言而喻,帶著這種壓力,緊接著上一章所學的知識,下面我係統的梳理一下我自學到的的知識。

第8章: 抽象資料型別與子程式

上一章我們討論了一種思想——抽象,在這一章我們進一步談論抽象和抽象容器,我們知道操作和它們做的事情,卻不知道操作是如何實現的。

8.1抽象資料型別

首先我們瞭解一下抽象資料型別的定義:

抽象資料型別(ADT):屬性(資料和操作)明確地與特定實現分離的容器。

設計的目標是通過抽象減小複雜度。
把ADT與上下文聯絡起來需要知道如何觀察資料。在計算機領域可以從應用層、邏輯層和實現層觀察資料。
應用(使用者)層是特定問題中的資料的檢視。
邏輯(抽象)層是資料值(域)和處理它們的操作的抽象檢視。
實現層明確表示出了存放資料項的結構,並用程式設計語言對資料的操作進行編碼。這個檢視用明確的資料域和子程式表示物件的屬性。這一層涉及了資料結構:

資料結構:一種抽象資料型別中的複合資料域的實現。

這一章的抽象資料型別是在現實世界的問題中反覆出現過的,這些ADT是儲存資料項的容器,每種ADT都具有特定的行為,稱它們為容器。

容器:存放和操作其他物件的物件。

8.2棧

棧是一種抽象複合結構。總結一下:
①只能從一端訪問棧中的元素,可以從第一個位置插入元素,也可以刪除第一個元素:這種型別的處理稱為LIFO,意思是後進先出。(可以類比一下餐廳拿走第一個盤子才能讓第二個盤子變成第一個。)
②刪除的項總是在棧中時間最短的專案。插入操作沒有任何約束;整個LIFO行為就體現在刪除操作上。
③插入操作叫做Push(推進),刪除操作叫做Pop(彈出)。
④棧沒有長度屬性,所以沒有返回棧中專案個數的操作。我們需要的是確定棧是否為空的操作,因為當棧空的時候再彈出專案會出錯。

8.3佇列

佇列也是一種抽象結構,但是:
①佇列中的專案只能從一端入,從另一端出,這種行為稱為FIFO,意思是先進先出。(類比一下超市排隊)
②刪除的總是在佇列中時間最長的專案。插入操作沒有任何約束,整個FIFO行為就體現在刪除操作上。
③插入操作和刪除操作沒有標準的相關術語!插入操作在佇列的尾部進行,刪除操作在佇列的頭部進行。

書上的例子上,按照相反順序輸出,那就利用棧(先進後出嘛),反之就用佇列~

8.4列表

列表有三個屬性特徵:專案是同構的、專案是線性的、列表是變長的。(線性:每個專案除了第一個都有一個獨特的組成部分在它之前,除了最後一個也都有一個獨特的組成部分在它之後。)
列表通常提供插入一個專案的操作、刪除專案的操作、檢索一個專案是否存在以及報告列表中專案數量,還有機制允許使用者檢視序列中的每一項。因為專案可以被刪除和檢索,所以列表中的專案必須能夠相互比較。

操作
插入 Insert
刪除 Delete
檢索 IsThere
報告數量 GetLength
檢視每一項 Reset、GetNext、Moreltems

不要把列表誤認為是陣列!!!!! 陣列是內嵌結構,而列表時抽象結構。但是列表應用於陣列之中。
列表也可以被形象化為鏈式結構,鏈式結構以節點的概念為基礎,一個節點由兩部分構成:使用者的資料和指向列表的下一個節點的連結或指標。列表的最後一個節點的指標變數存放的是表示列表結束的符號,通常是null,用“/表示。

鏈式結構:一個將資料項和找到下一項位置的資訊儲存到同一容器的實現方法。

無序列表的順序並不重要,專案只是隨意被放入其中。有序列表中,專案之間具有語義關係。除了第一個專案之外所有專案都存在某種排序關係。除了最後一個專案所有專案都有著相同的關係。

8.5樹

因為之前提到的本質上都是線性的,只模擬了一種資料關係。如果我們想模擬比較複雜的數字關係(比如動物階層)就需要一種具體的分層體系——樹。在計算領域,我們通常說的是二叉樹,即每個節點最多有兩個子節點的樹。

8.5.1二叉樹

二叉樹是一種抽象結構,其中每個節點可以有兩個後繼節點,叫做子女,這些子女也可以有自己的子女,依此類推就形成了樹的分支結構。樹的頭部是一個起始節點,叫做,它不是任何節點的子女。
如果一個節點左邊的子節點存在,那麼這個子節點叫做左子女,反之右邊的子節點存在,叫做右子女。如果一個節點沒有子女。則這個節點叫做樹葉

二叉樹:具有唯一起始節點(根節點)的抽象複合結構,其中每個節點可以有兩個子女節點,根節點和每個節點之間都有且只有一條路徑。
:樹中唯一的開始節點。
葉節點:沒有子女的樹節點。

此外,根節點和每個節點之間有且只有一條路徑,就是說,除了根節點外,每個節點都只有一個父母節點
根節點的每個子女本身又是一個小二叉樹或子樹的根。事實上,樹中每個節點都可以被看作一個子樹的根。根節點是樹中其它所有節點的先輩。(可以想象成高中生物學的系譜圖)

8.5.2二叉檢索樹

二叉檢索樹就像已排序的列表,節點間存在語義排序。二叉檢索樹具有二叉樹的形狀屬性,還具有語義屬性來刻畫樹中節點上的值,即任何節點的值都要大於它的左子樹中的所有節點的值,並且要小於它的右子樹中的所有節點的值。

8.5.2.1在二叉檢索樹中搜尋

(相似於第七章學的線性結構的二分檢索法)
如果current指向一個節點,那麼info(current)指的就是這個節點中的使用者資料,left(current)指向的是current的左子樹的根節點,right(current)指向的是current的右子樹的根節點。null是一個特殊值,說明指標指向空值。
根據書上給出的演算法,理解了在二叉檢索樹中搜尋的過程。

8.5.2.2構造二叉檢索樹

書上用一個具體例子為我們講述瞭如何構造二叉檢索樹。我剛開始沒有弄明白書上是怎麼比較字串之間的大小的,後來詢問了謝老師,才知道原來是按照ASCII字符集比較的,懂了懂了~

8.5.2.3輸出二叉檢索樹中的資料

根據書上給出的一個看似很容易的演算法,我也是努力去看了輸出這個樹的過程,終於看明白了,激動。

8.5.3其他操作

終於意識到,二叉檢索樹其實是和列表具有同樣功能的物件,它們的區別在於操作的有效性,而行為是相同的。
書上引出了Length操作的遞迴:

這個顯而易見吧,很好理解。

8.6圖

樹有一種約束,也就是一個節點至多隻有一個指向它的節點(父母),如果去掉這種約束,就得到了另外一種資料結構——。圖由一組節點和連線節點的線段構成。

:由一組節點和一組把節點相互連線起來的邊構成的資料結構。
頂點:圖中的節點。
邊(弧):表示圖中兩個節點的連線的頂點對。

圖中的頂點表示物件,那麼邊則描述了定點之間的關係。這種圖分為兩種:

無向圖:其中的邊沒有方向的圖。
有向圖:其中的邊是從一個頂點指向另一個頂點(或同一個頂點)的圖。

如果兩個頂點有一條邊相連,則把他們稱為鄰頂點,兩個頂點通過一條有順序的路徑相連。

8.6.1建立圖

列表、棧、佇列和樹都是可容納元素的容器。使用者根據特定的問題選擇最合適的容器,不被納入檢索過程的演算法是沒有固定語義的:棧返回的元素是在其中停留時間最少的元素。佇列返回的是在其中停留時間最長的元素。佇列和樹返回的資訊都是被請求的。然而不同的是,在圖中定義的演算法可以解決實際的問題

8.6.2圖演算法

8.6.2.1深度優先搜尋


這種搜尋叫做深度優先搜尋,因為我們走向最深的分支。但你必須回溯時,選擇離你無法走通位置的最近的分支繼續搜尋。相比於更早時候可選的其他分支,你會選擇一條儘可能可以走遠的路。
但是我還是覺得這個演算法太難以理解了。

8.6.2.2廣度優先搜尋

因為棧是按照元素出現的相反順序來儲存元素,而現在我們想回溯到儘可能遠,以找到從最初的頂點出發的路徑。那麼我們就不再適合用棧了,在這次我們只要把棧替換成佇列,就可以成功。

深度優先搜尋演算法從起點出發儘可能地往更遠的路徑檢查,而不是優先選擇檢查與起點相鄰的第二個頂點。相反,廣度優先搜尋會優先檢查所有與起點相鄰的頂點,而不是檢查與這些頂點相連的其他頂點。

8.6.2.3單源最短路搜尋

還是以從兩個城市之間的航班為例。就比如說我想從北京跑回到我的家鄉葫蘆島,我就肯定得走一條路程最短的路啊,要不然就累死了(我承認無論怎麼樣,我要是跑回去都得累死),就這麼個意思,所以這個時候我們就需要單源最短路搜尋了。我們需要輔助的資料結構儲存此後處理的城市,最後廣度優先搜尋演算法可以找到最小換成次數的航線。但是這並不代表最短的總距離。最短路遍歷必須說明在搜尋過程中城市間的距離,而不是像深度優先搜尋和廣度優先搜尋一樣。我們想要檢索當前頂點最近的頂點,也就是與此頂點相連的邊權值最小的頂點。我們稱這種抽象容器為優先佇列,被檢索的元素是在佇列中擁有最高優先度的元素,比如這裡,我們就讓距離數最為優先,則可以彈出一系列包括兩個頂點和兩個頂點間距離的元素。

8.7子程式

許多子程式都是高階語言或語言附帶庫的一部分。如果一個子程式需要傳遞資訊,調呼叫單元將會把值傳送給子程式來使用。

8.7.1引數傳遞

引數列表是子程式要使用識別符號或值的列表,它放置在子程式名後的括號中。由於子程式是在被呼叫之前定義的,所依它不知道呼叫單元會傳遞什麼樣的變數。為了解決這個問題,在子程式後面的括號中宣告瞭一個變數名的列表。這些識別符號稱為形參。當子程式被呼叫時,呼叫單元將列出子程式名,並在其後的括號中列出一系列識別符號。這些識別符號叫做實參。實參表示的是呼叫單元中的真實變數。

引數列表:程式中兩部分之間的通訊機制。
形參:列在子程式名後的括號中的識別符號。
實參:子程式呼叫中列在括號中的識別符號。

可以把形參看成是子程式中使用的臨時識別符號。當子程式被呼叫時,呼叫單元會把真正的識別符號的名字傳送給子程式。子程式中的動作則是用形參定義的。當動作執行時,實參將逐個替代形參。

當子程式被呼叫時候,它將得到一個實參列表。實參將告訴子程式在哪裡可以找到它要用的值。當子程式用到第一個形參時,子程式會通過形參在留言板上的相對位置訪問實參。呼叫子程式時傳遞的實參個數必須與子程式定義中的形參個數相同。但是形參和實參是通過位置匹配的,所以名字不必一致。以這種方式傳遞的形參通常叫做位置形參

8.7.2值參與引用引數

傳遞引數的基本方式有兩種,即通過值傳遞和通過引用傳遞。如果一個形參是值參,呼叫單元將把實參的一個副本傳遞給子程式。如果一個形參是引用引數,呼叫單元將把實參的地址傳遞給子程式。所以子程式不能改變實參內容(因為接受的只是一個副本),相反,子程式可以改變呼叫單元傳遞給引用引數的任何實參,因為子程式操作的是實際變數,而不是副本。

值參:由呼叫單元傳入實參的副本的形參。
引用引數:由呼叫單元傳入實參的地址的形參。

有的子程式是有返回值的,在這種情況下,子程式被呼叫的方式是用它的名字和引數的表示式;子程式也可能是沒有返回值的,在這種情況下,呼叫程式用子程式的名字作為宣告。

第9章: 物件導向設計與高階程式設計語言

在開始探索高階語言之前,我們需要了解物件導向的設計。物件導向的設計是審視設計過程的另一種方式,它從資料角度出發而非任務。因為程式的功能和設計過程在高階語言彙編過程中經常發生不匹配的情況,因此我們需要在探討特定的高階語言之前理解這種設計的過程。

9.1物件導向方法

物件導向的設計方法是用叫做物件的獨立實體生成解決方案的問題求解方法,物件由資料和處理資料的操作構成。物件導向設計的重點是物件以及它們在問題中的互動。一旦收集到了問題中的所有物件,它們就能構成問題的解決方案。

9.1.1物件導向

在物件導向的思想中,資料和處理資料的演算法綁在一起,因此每個物件負責自己的處理。物件導向設計(OOD)的底層概念是類和物件。

物件:在問題背景中相關的食物或實體
物件類:一組具有相似的屬性和行為的物件的描述
欄位:表示類的屬性
方法:定義了類的一種行為的特定演算法

類是一種模式,說明了物件是什麼以及它的行為。

9.1.2設計方法

分解過程有四個階段:
1、頭腦風暴:在物件導向的問題求解背景中,頭腦風暴是一種集體行為,為的是生成解決某個特定問題要用到的候選類的列表。
2、過濾:頭腦風暴下一階段要根據暫時的列表確定問題解決方案中的核心類。一個列表中也許有的類根本不屬於問題的解決方案,那麼我們就需要過濾,完成過濾後就進入了下一個階段。
3、場景:這個階段的目標是給每個類分配責任,最終責任將被實現為子程式。

責任的型別有兩種,即類自身必須知道什麼(知識)和類必須能夠做什麼(行為)。類把它的資料(知識)封裝了起來,使得一個類的物件不能直接訪問另一個類中的資料。所謂封裝,就是把資料和動作集中在一起,使資料和動作的邏輯屬性與它們的實現細節分離。封裝是抽象的關鍵。不過,每個類都有責任讓其它類訪問自己的資料。因此,每個類都有責任瞭解自身。

4、責任演算法
(執行責任的演算法一般都相當短)
5、總結
自頂向下的設計方法重點在於把輸入轉化成輸出的過程,結果將生成任務的體系結構。物件導向設計的重點是要轉換的資料物件,結果生成的是物件的體系結構。

9.1.3示例

物件導向的設計比自頂向下的設計更好,因為它建立的一些類還可以用於其他背景。可複用性是物件導向設計的一大優點。為一個問題設計的類還可以用於解決另一個問題,因為每個類都是自約束的,也就是說,每個類只負責自己的行為。

9.2翻譯過程

第六章就提到,用匯編語言編寫的程式要輸入彙編器,由它把組合語言指令翻譯成機器碼,最終執行的是彙編器輸出的機器碼。

9.2.1編譯器

翻譯用高階程式設計語言編寫的程式的程式叫做編譯器。早期編譯器輸出的是程式的組合語言版本,這個版本還要經過彙編器處理才能得到可執行的機器語言程式。但是隨著科學家更加深入地瞭解翻譯過程,編譯器變得複雜,組合語言的階段通常被省略了。

任何計算機只要具有一種高階語言的編譯器,就能執行用這種語言編寫的程式。注意編譯器是一種程式,所以要編譯一個程式,就必須具有這個編譯器在特定機器上的機器碼版本。如果想在多種型別的機器上使用一種高階語言,就要具備這種語言的多個編譯器。

9.2.2直譯器

直譯器:輸入用高階語言編寫的程式,指導計算機執行每個語句指定的動作的程式。

直譯器與彙編器和編譯器(只是輸出機器碼且機器碼再單獨執行)不同,它在翻譯過語句之後會立即執行這個語句。

翻譯器和模擬器都接受用高階語言編寫的程式作為輸入。翻譯器(彙編器或編譯器)只用適合的機器語言生成等價的程式,這個程式再單獨執行。而模擬器則直接執行輸入的程式。
——Terry Pratt

因為需要解釋的語言編寫的程式通常比要編譯的程式的執行速度慢很多,所以要編譯的語言發展成了主流,於是產生了Java
Java的設計中,可移植性是最重要的特徵。為了達到最佳可移植性,Java被編譯成一種標準機器語言——位元組碼。一種名為JVM的軟體直譯器接受位元組碼程式,然後執行它。也就是說,位元組碼不是某個特定硬體處理器的機器語言,任何具有JVM的機器都可以執行編譯過的Java程式。
標準化的高階語言實現的可移植性與把Java程式翻譯成位元組碼然後在JVM上解釋它所實現的可移植性是不同的。Java編譯器輸出的程式將被解釋,而不是直接被執行。

9.3程式設計語言範型

9.3.1命令式範型

命令式範型具有順序執行指令的特徵,變數的使用代表了記憶體地址,而是用賦值語句則改變這些變數的值。

9.3.1.1程式導向的範型

程式導向程式設計是一種命令式模型,在這裡語句被分組成子程式。一個程式是子程式分層次構成的,每一層執行整個問題求解的一個必要的特定任務。

9.3.1.2物件導向的範型

物件導向視角是與物件互動的一種方式。每個物件負責執行它自己的動作。
在程式導向的範型中,資料被認為是被動並且被程式所操控的;在物件導向的範型中,資料物件是活躍的。每個物件負責控制自己的操作。

9.3.2宣告式範型

宣告式範型是一個描述結果的模型,但是完成結果的過程則不被描述。在這種範型中的兩種基本模型:函式式和邏輯式

9.3.2.1函式式模型

基於函式的數學概念。基本的原理是函式的求值。

9.3.2.2邏輯程式設計

基於數理邏輯的原則。解決潛在問題的演算法用邏輯的規則來推演出事實和規則的答案。

9.4高階程式設計語言的功能性

命令式語言的標誌就是兩種虛擬碼結構——選擇和重複(迴圈)。首先先分析一下布林表示式:

9.4.1布林表示式

寫出語句然後測試是true還是false是程式設計語言提問的方式。這些語句稱為斷言或條件。編寫演算法是我們採用自然語言表示斷言。翻譯成高階程式語言時,這種用自然語言編寫的語句就會被重寫成布林表示式。
布林表示式是一個識別符號序列,識別符號之間由相容的運算子分隔,求得的值是true或false。

9.4.2資料歸類

只能在變數中儲存合適的型別的要求叫做強型別化

資料型別是描述一組數值和一組可以應用在這種型別的數值上的基本操作。
大多數高階語言都有四種資料型別:整數、實數、字元和布林型
宣告是把變數、動作或語言中的其他實體與識別符號關聯起來的語句,使程式設計師可以通過名字引用這些專案。
保留字是一種語言中具有特殊意義的字,不能用它作為識別符號。
注意C++、Java、Python和VB.NET是區分大小寫的,這意味著大小寫不同的同一識別符號會被認為是不同的詞。

9.4.3輸入/輸出結構

高階語言把輸入的文字資料看作一個分為多行的字元流。字元的含義由存放值的記憶體單元的資料型別決定輸出與基礎所有輸入語句都由三部分構成:要存放資料的變數的宣告、輸入語句和要讀入的變數名以及資料流自身。
在非強型別語言中,輸入的格式決定了型別。 輸出語句建立字元流。在強型別語言中不管輸入輸出語句的語法或輸入輸出流在哪,處理的關鍵在於資料型別。資料型別確定字元是如何被轉換為位模式以及如何被轉換為字元。

9.4.4控制結構

重複、選擇和子程式,這種結構叫做控制結構,因為他們決定了其他指令在程式中被執行的順序。
1、巢狀邏輯
2、非同步處理
非同步:不與計算機這種的其他操作同時發生。

9.5面嚮物件語言的功能性

9.5.1封裝

封裝:實施資訊隱蔽的語言特性
物件(問題求解階段):與問題背景相關的事物或實體
類(實現階段):物件的模式
物件類或類(問題求解階段):屬性和行為相似的一組物件的說明
物件(實現階段):類的一個例項

9.5.2類

如果用識別符號來代表一個類,那麼必須在使用前顯式地詢問即將被建立的類。也就是需要例項化這個類,以獲取符合這種模式的物件。

例項化:建立類的物件

9.5.3繼承

繼承:類獲取其他類的屬性(資料欄位和方法)的機制

9.5.4多型

多型是語言在執行時確定給定呼叫將執行哪些可能的方法的能力。

9.6過程設計與物件導向設計的區別

總結與反思

自學了這麼多內容,有很多東西不是很理解。比如說第八章的搜尋與引數還有第九章部分概念,但是還是有很大收穫,也更加鞏固了之前的知識,再接再厲。

思維導圖

用兩張思維導圖“來個了斷”吧~


相關文章