數據結構學習筆記 第一章 數據結構論敘

第一章 數據結構論敘

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記號的求解:直接取最高次項,去掉係數。例:
T(n)=2n2+2n+1=O(n2) T(n) = 2n^2 +2n+1 = O(n^2 )

這裏描述起來相對繁瑣,以以下例子來表示:
  • 順序結構的時間複雜度爲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 = 1while (count < n)
{
	count = count * 2;
}

我們設基本操作執行x次,則在以下情況會退出循環
2x=n 2^x = n
算出來發現 x = log2n,因此這段程序的時間複雜度是O(log n)

  • 數據結構中常見的時間複雜度的比較關係

在這裏插入圖片描述

Ps: n log2n叫二維型

最壞時間複雜度

定義:討論算法在最壞情況下的時間複雜度,即分析最壞情況下估計出算法執行時間的上界。通常除非指定,我們提到的運行時間都是最壞情況的運行時間。與之相對的是平均時間複雜度,是算法的期望運行時間。(概率統計)

1.5.2算法的空間複雜度

定義:用於度量一個算法在運行過程中臨時佔用的空間大小。

一般是以問題規模n爲變量的函數,採用數量級形式描述,記爲:
S(n)=O(f(n)) S(n)=O(f(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];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章