資料結構——概述
什麼是資料結構
資料結構主要研究非數值計算程式問題中的操作物件以及他們之間的關係,不是研究複雜的演算法。
資料結構中的基本概念
資料
什麼是資料?
程式操作物件,用於描述客觀事物
資料的特點:
- 可以輸入到計算機
- 可以被計算機處理
資料是一個抽象的概念,將其分類後得到程式設計語言中的型別,如int、float、char等。
資料元素:
組成資料的基本單位;
資料項:
一個數據元素由若干資料項組成;
資料物件:
性質相同的資料元素的集合,如陣列,連結串列。
資料結構研究結點和結點之間的關係(陣列、連結串列、圖、樹)
資料結構的邏輯關係
- 集合:資料元素簡除“同屬於一個集合”外,無其他關係;
- 線性結構:一個對一個如線性表、棧、佇列;
- 樹形結構:一個對多個,如樹;
- 圖狀結構:多對多,如圖。
資料的物理結構
物理結構也稱為儲存結構,是資料的邏輯結構在計算機儲存內的表示,依賴於計算機。
可分為:順序、鏈式、索引、雜湊。
最常用的儲存結構:
- 順序儲存結構:藉助元素在儲存器中的相對位置來表示元素間的邏輯關係;
- 鏈式儲存結構:藉助指示元素儲存地址的指標表示資料元素間的邏輯關係。
資料的運算
在資料的邏輯結構上定義的操作,它在資料的儲存結構上實現。如插入、刪除、修改、查詢、排序。
演算法
基本概念
演算法是特定問題的求解步驟的描述,在計算機中表現為指令的有限序列,演算法是獨立存在的一種解決問題的方法和思想,對於演算法,語言並不重要,重要的是思想。
資料結構和演算法的區別
資料結構只是靜態的描述了資料元素之間的關係,高效的程式需要在資料結構的基礎上設計和選擇演算法。
程式=資料結構+演算法
演算法的特性
有窮性、確定性、可行性
演算法效率的度量
-
事後統計法:比較不同的演算法對同一輸入數的執行處理時間
缺陷:- 為了獲得不同演算法的執行時間必須編寫相應的程式;
- 執行時間嚴重依賴硬體以及執行時的環境因素;
- 演算法的測試資料的選取相當困難;
-
事前分析估算:依據統計的方法對演算法效率進行估算;
影響演算法效率的主要因素:
1.演算法採用的策略和方法
2.問題的輸入規模
3.編譯器所產生的程式碼
4.計算機執行速度
O表示法(時間複雜度)
- 判斷一個演算法的效率時,往往只需要關注運算元量的最高次項,其他次要項和常數項可以忽略;
- 在沒有特殊說明時,我們所分析的演算法的時間複雜度都是指最壞時間複雜度。
常見時間複雜度
階 | 非正式術語 |
---|---|
O(1) | 常數階 |
O(n) | 線性階 |
O(n^2) | 平方階 |
O(logn) | 對數階 |
O(nlogn) | nlogn階 |
O(n^3) | 立方階 |
O(2^n) | 指數階 |
關係O(1)< O(logn)< O(n)< O(n^2)< O(n^3)< O(2^n)< O(n!)< O(n^n)
演算法的空間複雜度
演算法的空間複雜度通過計算演算法的儲存空間
S(n)=O(f(n))
當演算法執行時所需要的空間是常數時,空間複雜度為O(1);
犧牲空間
案例:
求出給定陣列中出現次數最多的那個數。
方法:建立一個給定範圍的新陣列,用來快取出現的次數,給定陣列中元素每出現一次,將新陣列中的這個元素-2為索引的元素加1次。
#include <stdio.h>
#include <windows.h>
int search(int a[]){
int sp[10] = { 0 };
int index = 0;
for (int i = 0; i < 10; i++){
sp[a[i] - 1] = sp[a[i] - 1] + 1;
index = sp[a[i] - 1] > sp[index] ? a[i] - 1 : index;
}
return index + 1;
}
void main(){
int a[10] = { 4, 2, 3, 4, 4, 1, 1, 1, 4, 4 };
int num = search(a);
printf("出現次數最多的數是:%d", num);
system("pause");
}