第一章:緒論
1.基本概念以及術語:
- 數據:信息的載體,是 描述客觀事物 屬性的數、字符及所有能輸入到計算機中並被計算機程序識別和處理的 符號的集合
- 數據對象:具有相同性質的數據元素的集合,是數據的個子集
- 數據元素: 數據的基本單位 ,通常作爲個整體進行考慮和處理
- 數據項:構成數據元素的不可分割的 最小單位
數據包含數據對象,數據元素構成數據對象。
所有人的身份信息就可以作爲數據對象,每一個人的身份信息就可以作爲數據元素,身份信息的姓名、編號就可以作爲數據項。
1.1數據
數據類型(集合+操作)
- 原子類型:值集合+操作(int、char、float等)
- 結構類型:結構的集合+操作(list、map、set等)
- 抽象數據類型ADT:抽象數據類型抽象數據類型(ADT)是指一個
數學模型
以及定義在該模型上的一組操作
。抽象數據類型的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關
。通常用(數據對象、數據關係、基本操作集
)這樣的三元組來表示抽象數據類型。
1.2結構
在任何問題中,數據元素都不是孤立存在的,而是在它們之間存在着某種關係,這種數據元素相互之間的關係稱爲結構
(Structure)。數據結構是相互之間存在一種或多種特定關係的數據元素的集合。數據結構包括三方面的內容:邏輯結構、存儲結構和數據的運算
。數據的邏輯結構和存儲結構是密不可分的兩個方面,一個算法的設計
取決於所選定的邏輯結構,而算法的實現
依賴於所採用的存儲結構。
1.3數據結構
數據結構 是相互之間存在一種或多種特定 關係 的 數據元素 的集合。
1.4數據結構三要素
- 邏輯結構
- 物理結構(存儲結構)
- 數據的運算
1.5邏輯結構
邏輯結構
是指數據元素之間的邏輯關係
即從邏輯關係上描述數據。它與數據的存儲無關
,是獨立於計算機的。
數據的邏輯結構分爲線性結構
和非線性結構
集合
結構中的數據元素之間除了“同屬於一個集合”的關係外,別無其他關係。類似於數學上的集合線性結構
結構中的數據元素之間只存在一對一
的關係。比如排隊樹形結構
結構中的數據元素之間存在一對多的關係。比如家族族譜圖狀結構或網狀結構
結構中的數據元素之間存在多對多的關係。比如地圖
1.6物理結構(存儲結構)
存儲結構是指數據結構在計算機中的表示(又稱映像),也稱物理結構。它包括數據元素的表示和關係的表示。數據的存儲結構是邏輯結構用計算機語言的實現,它依賴於計算機語言。數據的存儲結構主要有:順序存儲、鏈式存儲、索引存儲和散列存儲
。
- 順序存儲:存儲的物理位置相鄰。(ps.理位置即信息在計算機中的位置。)
- 鏈接存儲:存儲的物理位置
未必
相鄰,通過記錄相鄰元素的物理位置來找到相鄰元素。 - 索引存儲:類似於目錄,通過索引查詢。
- 散列存儲:通過關鍵字直接計算出元素的物理地址(以後詳解)
順序存儲:存儲的物理位置相鄰。
鏈接存儲:存儲的物理位置未必
相鄰
1.7數據的運算
運算包括運算的 定義 和 實現 ,運算的定義針對 邏輯結構,運算的實現針對 物理結構 。
示例:以人爲例,假設有一個運算是計算人的顏值。
顏值=五官的漂亮程度之和(運算的定義針對邏輯結構)
通過計算機讀取每個人五官的信息,然後相加得到顏值。(運算的實現針對物理結構)
2.算法&算法評價
2.1算法
算法: 對特定問題求解的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。
2.2算法特性
- 有窮性:一個算法必須在執行
有窮步
後結束,並且每步操作都在有窮時間內完成。 - 可行性:一個算法必須是可行的,算法中描述的操作是可以實現的。
- 確定性:算法中每一條指令、每一條語句都必須有確定的含義,同樣的輸入,必須要得到同樣的輸出。
- 輸入:一個算法必須要有零個或者多個輸入。
- 輸出:一個算法必須要有零個或者多個輸出。
2.2算法 VS 程序
算法(指導者):解決問題的一箇中方法或者過程,考慮如何將輸入轉換成輸出,一個問題可以有很多個算法。
程序(實施者):程序是某中設計語言對算法的具體實現。
有窮性:算法必須是有窮的,程序可以是無窮的。
正確性:算法必須是正確的,程序可以是錯誤的。
描述方法:算法可以用僞代碼、程序語言等描述,程序只能用程序語言編寫並可以運行。
2.3算法效率的度量
時間複雜度
:
- 它用來衡量算法隨着問題規模增大,算法執行時間增長的快慢。·
- 時間複雜度是問題規模的函數:記作T(n),時間複雜度主要分析T(n)的數量級
- T(n)=O(f(n)),大O記法,f(n)是算法中基本運算的頻度,一般我們考慮
最壞情況
下的時間複雜度。
計算方法
:取算法時間增長最快
的那個函數項,把它的係數改爲1
基本運算頻度:最深層循環所執行的時間複雜度。
常見時間複雜度
O(1)<O(log~2~^n^)<O(n)<O(nlog~2~^n^)<O(n^2^)<O(n^3^)<O(2^n^)<O(n!)<O(n^n^)
空間複雜度:
- 它用來衡量算法隨着問題規模增大,算法所需空間的增長的快慢:
- 是問題規模的函數:S(n)=0(g(n))
2.4時間複雜度
複雜度如何計算
int sum=0; //執行1次
for(inti=0;i<=n;i++){ //int i=0執行一次,i<n執行n+1次,i++執行n+1次
sum=sum+i;
}
時間分析:該算法執行了3n+6個語句。
假設每個語句執行時間一致,均爲常數t。則總時間t=(3n+6)*t
隨着問題規模n的增大,總時間的增長率與n的增長率一致,所以複雜度爲O(n)
結論:
- 複雜度是關於
增長率
的,所以可以直接忽視常數項,係數化爲1
。 - 一般可以直接關注
循環段基本操作語句
(示例中的sum=sum+i
)的執行次數
。
時間複雜度計算(單個循環體
)
直接關注循環體的執行次數
,設爲k
時間複雜度計算(多個循環體
)
兩個運算規則:乘法規則,加法規則
。
2.5空間複雜度
空間複雜度S(n)指算法運行過程中所使用的輔助空間
的大小,記爲:S(n)=(f(n))
- 輔助空間:除了存儲算法
本身
的指令、常數、變量和輸入數據外,還需要存儲對數據操作的存儲單元。 - 算法
原地工作
是指算法所需的輔助空間是常量,即O(1)。 - 常見的是O(1),O(n)較多
歡迎關注公衆號 理木客
更多精彩等你發現