2020-2021-1學期 20202421《網路空間安全專業導論》第四周學習總結
本週學習內容
第八章
本章主要介紹了抽象資料型別以及相關的許多概念
下面會列出一些相對重要的概念
抽象資料型別
抽象資料型別是電腦科學中具有類似行為的資料結構的數學模型,或者具有類似語義的一種或多種程式設計語言的資料型別。其特徵主要體現在資料抽象,資料封裝,繼承性,多型性。在程式語言的應用中,經常見到的幾個抽象資料的應用如下:關聯陣列,如c++中的%d等引用,複數,容器,雙端佇列,列表佇列,堆疊,字串,樹。這些內容都與抽象資料有著密不可分的關係。
接下來對抽象資料型別中一些較為重要的內容進行記錄
圖
圖是由由一組節點和一組把節點相互連線起來的邊構成的資料結構。這部分內容涉及到較為深入的演算法內容,如深度優先搜尋,廣度優先搜尋,單源最短路搜尋,接下來舉一個廣度優先搜尋的程式碼例子
#include<iostream>
#include<queue>
using namespace std; int a[30][30],b[30]; int n,m; struct node{ int wss[30]; int num[30]; int ans; }q; void bfs() { queue<node>que; q=que.front(); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) q.wss[j]=a[i][j]; q.num[1]=i; q.ans=1; que.push(q); } while(!que.empty()) { node s,t; s=que.front(); t=que.front(); que.pop(); bool w=1; for(int i=1;i<=n;i++) { if(s.wss[i]<b[i]) { w=0; break; } } if(w==1) { cout<<s.ans<<' '; for(int i=1;i<=s.ans;i++)cout<<s.num[i]<<" "; return; } for(int i=s.num[s.ans]+1;i<=m;i++) { for(int j=1;j<=n;j++) t.wss[j]=s.wss[j]+a[i][j]; t.ans=s.ans+1; t.num[t.ans]=i; que.push(t); } } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>b[i]; cin>>m; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; bfs(); return 0; }
以上程式碼是較為基礎的dfs應用
二叉檢索樹
二叉樹的定義如下:
一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別為二叉排序樹;
在很多情況下 二叉檢索樹是一種較優的演算法 考慮速度以及複雜度時都是較好的選擇 這部分內容與連結串列的關係也很大 但二叉樹演算法在大部分情況下優於連結串列
第九章
本章主要介紹了面向物件方面的一些內容以及高階程式設計語言的一些基礎內容 以下列出一些我認為較為重要的
編譯
編譯是利用編譯程式從源語言編寫的源程式產生目標程式的過程也可以說是編譯程式產生目標程式的動作 在各種語言中 這個過程都不盡相同 例如 在c++中 這個過程從原始碼進入編譯器開始,首先變為彙編程式碼,在進入彙編器變為目的碼,之後目的碼,庫檔案和其他目的碼一同進入連結器生成可執行程式。
封裝
封裝是指隱藏物件的的屬性和實現細節,僅提供公共訪問方式。封裝的方式有很多,舉個例子:將成員變數私有化,對外提供對應的set ,get方法對其進行訪問以提高對資料訪問的安全性。