第一章 數據結構論敘
1.1什麼是數據結構?
數據:所有能夠輸入到計算機中且能夠被處理的
數據結構:數據對象+結構。。。就這對數據之間的關係構成結構
1.1.1數據之間的關係(腦子版本)
邏輯結構類型:集合(莫得關係),線性結構(一對一),樹形結構(一對多),圖形結構(多對多)
前驅元素,後繼元素,終端元素
1.1.2儲存結構類型(計算機版本)
順序儲存結構:
邏輯上相鄰的元素,物理上存放也是相鄰的。數組什麼的。
鏈式存儲結構
每個節點的元素不一定是連續的,邏輯上相鄰的元素,在物理上存儲不是相鄰的,用指針來表示邏輯關係。鏈表是這種。
索引存儲結構
類似字典的那種結構
哈希散列結構
哈希表底層使用的也是數組機制,數組中也存放對象,而這些對象往數組中存放時的位置比較特殊,當需要把這些對象給數組中存放時,那麼會根據這些對象的特有數據結合相應的算法,計算出這個對象在數組中的位置,然後把這個對象存放在數組中。而這樣的數組就稱爲哈希數組,即就是哈希表。
就是一個數據該存在那裏,是算出來的。
1.1.3數據運算
數據運算就是對數據的操作(則行家,刪除,查找,修改等等)
層次:運算描述(人腦)+運算實現(計算機層次)
1.2認識一個新的數據結構
1.2.1ADT
(一種抽象邏輯表示,理解爲模型)
定義一個複數
ADT complex{
數據對象:D={real, image | real∈實數, image∈實數}
數據關係:R={<real,image>}
基本操作:
InitComplex(&C)
操作結果:構造一個複數。
GetReal(C, &real)
初始條件:複數C存在。
操作結果:用real返回複數C的實部。
GetImage(C, &image)
初始條件:複數C存在。
操作結果:用image返回複數C的虛部。
OutputComplex(C)
初始條件:複數C存在。
操作結果:輸出複數C的值。
Add(C1,C2,&C)
初始條件:複數C1,C2存在。
操作結果:用複數C返回複數C1,C2的和。
Sub(C1,C2,&C)
初始條件:複數C1,C2存在。
操作結果:用複數C返回複數C1,C2的差。
Mul(C1,C2,&C)
初始條件:複數C1,C2存在。
操作結果:用複數C返回複數C1,C2的乘積。
Div(C1,C2,&C)
初始條件:複數C1,C2存在。
操作結果:用複數C返回複數C1除以C2的值。
}ADT Complex
1.3算法
解決一系列問題的騷操作加算法
-
算法的特性
有限性,確定性,可行性,輸入和輸入
-
算法和程序的關係
程序:使用某種計算機語言對一個算法的具體實現。
算法:重於對解決問題的方法描述,即要幹啥。可用自然語言,類語言,高級語言。
-
算法設計的要求:
正確性,可讀性,健壯性,高效率低儲存量。
1.5算法分析(重點內容)
-
主要包含兩個方面:正確性和成本
正確性是基本的,成本就是評價算法優劣的,當然執行時間和運行所用儲存空間就是判斷方式。
1.5.1算法執行時間分析方式
1.5.1.1事後分析統計法:
跑一遍再說。
1.5.1.2事前估算分析方法:
觀察:問題的規模是決定計算成本的主要因素(處理10組數據和10000組數據emm)
如果數據規模爲n,那麼運行時間會和n有關係,我們可以把它寫成關於n的函數
算法時間比較本質是算法中語句執行次數的比較(語句頻度),語句頻度是問題規模n的函數,我們用T(n)
表示算法的執行時間,通過比較不同算法的T(n)
大小來得出算法執行時間的好壞。
漸進分析
漸進分析是指:在問題規模足夠大後,計算成本如何增長?
漸進分析:大O記號——T(n) = O(f(n))
T(n) = O(f(n))表示存在一個正的常數C,使得當n≥n 0 時都滿足:
|T(n)|≤C|f(n)|
– f(n)是T(n)的 上界
– 這種上界可能很多,通常取最接近的上界,即緊湊上
界
大O記號的求解:直接取最高次項,去掉係數。例:
這裏描述起來相對繁瑣,以以下例子來表示:
- 順序結構的時間複雜度爲O(1)
int sum = 0, n = 100;
sum = (1 + n) * n / 2;
sum = (1 + n) * n / 2;
sum = (1 + n) * n / 2;
sum = (1 + n) * n / 2;
printf(“%d”, sum);
//明顯這段代碼執行次數爲長輸,語句頻度是恆定的,是常數階
//一般來講,莫得循環
- 線性階 O(n)
int i;
for (i=1; i<= n; i++)
x=x+1;
//一重循環
- 平方階 O(n2 )
for (i=1; i<= n; i++)
for (j=1;j<= n; j++)
x=x+1; //這句叫做基本操作
//二重循環->推廣到多重
- O(log n)
int count = 1;
while (count < n)
{
count = count * 2;
}
我們設基本操作執行x次,則在以下情況會退出循環
算出來發現 x = log2n,因此這段程序的時間複雜度是O(log n)
- 數據結構中常見的時間複雜度的比較關係
Ps: n log2n叫二維型
最壞時間複雜度
定義:討論算法在最壞情況下的時間複雜度,即分析最壞情況下估計出算法執行時間的上界。通常除非指定,我們提到的運行時間都是最壞情況的運行時間。與之相對的是平均時間複雜度,是算法的期望運行時間。(概率統計)
1.5.2算法的空間複雜度
定義:用於度量一個算法在運行過程中臨時佔用的空間大小。
一般是以問題規模n爲變量的函數,採用數量級形式描述,記爲:
例子
- 若算法執行所需要的輔助空間爲常數 時間複雜度爲O(1)
- 舉個栗子爲 O(n)
for( i = 0; i < n; i++)
b[i] = a[n-i-1];
for( i = 0; i < n;i++)
a[i] = b [i];