數據結構的起源ios
計算機從解決數值計算問題到解決生活中的問題算法
現實生活中的問題涉及不一樣個體間的複雜關係數組
須要在計算機程序中描述生活中個體間的聯繫數據結構
數據結構主要研究非數值計算程序問題中的操做對象以及它們之間的關係函數
不是研究複雜的算法測試
數據結構中的基本概念spa
數據—程序的操做對象,用於描述客觀事物設計
數據的特色:指針
能夠輸入到計算機code
能夠被計算機程序處理
數據是一個抽象的概念,將其進行分類後獲得程序設計語言中的類型。如:int,float……
數據元素:組成數據的基本單位
數據項:一個數據元素由若干數據項組成
數據對象 – 性質相同的數據元素的集合 (好比:數組,鏈表)
數據元素之間不是獨立的,存在特定的關係,這些關係即結構
數據結構指數據對象中數據元素之間的關係
數據結構:研究關係
節點和節點之間的關係(數組、鏈表、樹、圖)
數據的邏輯結構
指數據元素之間的邏輯關係。即從邏輯關係上描述數據,它與數據的存儲無關,是獨立於計算機的。邏輯結構可細分爲4類:
(集合)----數據元素間除「同屬於一個集合」外,無其它關係
線性結構----一個對一個,如線性表、棧、隊列
樹形結構----一個對多個,如樹
圖狀結構----多個對多個,如圖
數據的物理結構
物理結構亦稱存儲結構,是數據的邏輯結構在計算機存儲器內的表示(或映像)。它依賴於計算機
存儲結構可分爲4大類:順序、鏈式、索引、散列
最經常使用的存儲結構爲:
順序存儲結構----藉助元素在存儲器中的相對位置來表示數據元素間的邏輯關係
鏈式存儲結構----藉助指示元素存儲地址的指針表示數據元素間的邏輯關係
數據的邏輯結構與存儲結構密切相關
算法設計à邏輯結構
算法實現à存儲結構
數據的運算
在數據的邏輯結構上定義的操做,它在數據存儲結構上實現
最多見的數據運算有5種:
插入、刪除、修改、查找、排序
算法概念
算法是特定問題求解步驟的描述
在計算機中表現爲指令的有限序列
算法是獨立存在的一種解決問題的方法和思想
對於算法而言,語言並不重要,重要的是思想
算法和數據結構區別
數據結構只是靜態的描述了數據元素之間的關係
高效的程序須要在數據結構的基礎上設計和選擇算法
程序=數據結構+算法
總結:
算法是爲了解決實際問題而設計的
數據結構是算法須要處理的問題載體
數據結構與算法相輔相成
算法特性
輸入:算法具備0個或多個輸入
輸出:算法至少有1個或多個輸出
有窮性:算法在有限的步驟以後會自動結束而不會無限循環
肯定性:算法中的每一步都有肯定的含義,不會出現二義性
可行性:算法的每一步都是可行的
算法效率的度量
比較不一樣算法對同一組輸入數據的運行處理時間
缺陷
爲了得到不一樣算法的運行時間必須編寫相應程序
運行時間嚴重依賴硬件以及運行時間的環境因素
算法的測試數據的選取至關困難
過後統計法雖然直觀,可是實施困難且缺陷多
依據統計的方法對算法效率進行估算
影響算法效率的主要因素
算法採用的策略和方法
問題的輸入規模
編譯器所產生的代碼
計算機執行速度
判斷一個算法的效率時,每每只須要關注操做數量的最高次項,其它次要項和常數項能夠忽略。
在沒有特殊說明時,咱們所分析的算法的時間複雜度都是指最壞時間複雜度。
大O表示法
算法效率嚴重依賴於操做(Operation)數量
在判斷時首先關注操做數量的最高次項
操做數量的估算能夠做爲時間複雜度的估算
O(5) = O(1)
O(2n+1) = O(2n) = O(n)
O(n2+n+1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)
常見時間複雜度
執行次數函數 |
階 |
非正式術語 |
12 |
O(1) |
常數階 |
2n+3 |
O(n) |
線性階 |
3n2+2n+1 |
O(n2) |
平方階 |
5log2n + 20 |
O(logn) |
對數階 |
2n+3nlog2n+19 |
O(nlogn) |
nlogn階 |
6n3+2n2+3n+4 |
O(n3) |
立方階 |
2n |
O(2n) |
指數階 |
通常的關係:
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n3)< O(2n)<O(n!)<O(nn)
1 //這次代碼在codeblocks 17.12 下成功運行 2 #include <iostream> 3 4 using namespace std; 5 //時間換空間 6 /* 7 問題: 8 在一個由天然數1-1000中某些數字所組成的數組中,每一個數字可能出現零次 9 或者屢次。設計一個算法,找出出現次數最多的數字 10 */ 11 12 void Search(int *a, int len); 13 14 int main() 15 { 16 int ary[] = {1,1,2,8,8,8,9,4,4,5,6,7,9,9,9,9}; 17 Search(ary,sizeof(ary)/sizeof(*ary)); 18 return 0; 19 } 20 21 void Search(int *a, int len) 22 { 23 int sp[1000] = {0}; 24 int i = 0; 25 int Max = 0; 26 27 //將數組中的值減1賦給另一個數組的索引即下標 28 for(i=0; i<len; i++) 29 { 30 int index=a[i]-1; 31 sp[index]++; //計算每一個數字出現的次數 32 } 33 34 //在新的數組空間內找出最大的次數 35 for(i=0; i<1000; i++) 36 { 37 if(Max < sp[i]) 38 { 39 Max = sp[i]; 40 } 41 } 42 43 //輸出出現最屢次數的數字 44 for(i=0; i<1000; i++) 45 { 46 if(Max == sp[i]) 47 { 48 //cout << "數字出現最多的次數爲 " << Max << endl; 49 cout << "出現次數最多的數字爲 " << i+1 << endl; 50 } 51 } 52 }