重學數據結構之第一章——數據結構緒論和算法

前言

之前買了兩本書,一本《大話設計模式》,一本《大話數據結構》,其實這兩本書都被我看完了,但是看完之後一臉懵逼,看的快,忘得疾。之前老師都教過我們,好記性不如賴筆頭。於是決定還是再看一遍順便做個筆記。本專欄筆記內容來自《大話數據結構》。

數據的基本概念和術語

此處我用圖表的方式表示出來,如下圖:
在這裏插入圖片描述

邏輯結構的分類圖示:

在這裏插入圖片描述

物理結構分類圖示:

在這裏插入圖片描述

抽象數據類型

數據類型:

是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。
在C語言中,按照取值的不同,數據類型可以分爲兩類:

  • 原子類型: 是不可以再分解的基本類型,包括整型、實型、字符型等。
  • 結構類型:由若千個類型組合而成,是可以再分解的。例如,整型數組是由若干整型數據組成的。

抽象數據類型

抽象數據類型(Abstract Data Type, ADT):是指一個數學模型及定義在該模型上的一組操作。抽象數據類型的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。

總結:

在這裏插入圖片描述

算法

定義

算法是解決《特定問題求解步驟的描述》,在計算機中表現爲指令的有限序列,並且每條指令表示一個或多個操作。

算法的特性

在這裏插入圖片描述

算法的設計要求

在這裏插入圖片描述

算法的度量方法

在這裏插入圖片描述

函數的漸近增長

給定兩個函數f(n)和g(n),如果存在一個整數N,使得對於所有的n> N, f(n)總是比g(n)大,那麼,我們說f(n)的增長漸近快於g (n)。

算法的時間複雜度

在進行算法分析時,語句總的執行次數T (n)是關於問題規模n的函數,進而分析T(n)隨n的變化情況並確定T(n)的數量級。算法的時間複雜度,也就是算法的時間量度,記作: T(n)= 0(f(n)。它表示隨問題規模n的增大,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸近時間複雜度,簡稱爲時間複雜度。其中f(n)是問題規模n的某個函數。
這樣用大寫O()來體現算法時間複雜度的記法,我們稱之爲大O記法。

推導大O階方法

1.用常數1取代運行時間中的所有加法常數。
2.在修改後的運行次數函數中,只保留最高階項。
3.如果最高階項存在且不是1,則去除與這個項相乘的常數。得到的結果就是大O階。

常數階

執行次數恆定,記作O(1).

線性階

循環體中的代碼須要執行n次,記作O(n)

對數階
int count = 1;
while (count < n)
{
	coutn = count * 2;/*時間複雜度爲0(1)的程序步驟序列*/
}

由於每次count乘以2之後,就距離n更近了一分。也就是說,有多少個2相乘後大於n,則會退出循環。由2x=n 得到x=log2n。 所以這個循環的時間複雜度爲O(logn)。

平方階
int i,j;
for ( i=0 ; i<n ; i++ )
{
	for( j=0 ;j <n ;j ++)
	{
		/*時間複雜度爲0(1)的程序步驟序列*/
	}
}

而對於外層的循環,不過是內部這個時間複雜度爲0(n)的語句,再循環n次。所以這段代碼的時間複雜度爲0(n2)。

常見的時間複雜度

圖片來自《大話數據結構》
圖片來自大話數據結構

最壞情況與平均情況

算法的空間複雜度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章