本節內容概要算法
- 數據結構及算法概念以及用途
- 數據結構分類
- 算法的5大特徵
- 算法的時間複雜度與空間複雜度
1). 數據結構是一門研究數據組織方式的學科,能夠幫助咱們寫出高效優雅的代碼。選擇適當的數據結構能夠提升程序的執行效率(時間複雜度)和存儲效率(空間複雜度)數組
2). 算法是用來操做數據的一種方法,解決某個問題的計算方法、步驟。數據結構是爲算法服務的,算法要做用在特定的數據結構之上程序=數據結構+算法數據結構
weixin sousuo guanzhu "SpringForAll社區" ,學習更多!!!函數
1).線性結構: 簡單的先後關係: 數組、鏈表、隊列和棧學習
2).樹結構:普通樹、二叉樹code
3).圖結構:隊列
和非線性結構get
線性結構:一對一的關係博客
1) 線性結構做爲最經常使用的數據結構,其特色是數據元素之間存在一對一的線性關係 2) 線性結構有兩種不一樣的存儲結構,即順序存儲結構(數組)和鏈式存儲結構(鏈表)。順序存儲的線性表稱爲順序表,順序表中的存儲元素是連續的 3) 鏈式存儲的線性表稱爲鏈表,鏈表中的存儲元素不必定是連續的,元素節點中存放數據元素以及相鄰元素的地址信息 4) 線性結構常見的有:數組、鏈表、隊列和棧
樹結構:一對多的關係it
圖:適合存儲多對多的關係
時間複雜度:是一個 函數 ,它用來描述該算法的運行時間。一般用O()函數來表示算法的變化趨勢
咱們在分析一個算法、一段代碼的時間複雜度的時候,也只關注循環執行次數最多的那一段代碼就能夠了
總複雜度=複雜度最高的那段代碼的複雜度,以下
int cal(int n) { int sum_1 = 0; int p = 1; //時間複雜度 O(n) for (; p < 100; ++p) { sum_1 = sum_1 + p; } int sum_2 = 0; int q = 1; //O(n) for (; q < n; ++q) { sum_2 = sum_2 + q; } int sum_3 = 0; int i = 1; int j = 1; //O(n^2) for (; i <= n; ++i) { j = 1; for (; j <= n; ++j) { sum_3 = sum_3 + i * j; } } return sum_1 + sum_2 + sum_3; }
以上代碼的時間複雜度按照最多的
O(n^2)
只關注執行次數最多的一段代碼,以下
public int cal(int n) { int sum = 0; int I = 1; for (; I <= n; ++i) { sum = sum + I; } return sum; }
咱們只關注執行次數最多的for循環,執行了n次,所以這段代碼的時間複雜度爲
O(n)
乘法法則: 嵌套代碼時間複雜度 = 內外嵌套代碼時間複雜度的乘積
// O(n) int cal(int n) { int ret = 0; int i = 1; for (; i < n; ++i) { ret = ret + f(i); } } //O(n) int f(int n) { int sum = 0; int i = 1; for (; i < n; ++i) { sum = sum + i; } return sum; }
上面代碼的時間複雜度 = O(n) * O(n) = O(n^2)
要查找的變量 x 在數組中的位置,有 n+1 種狀況:在數組的 0~n-1 位置中和不在數組中,
時間複雜度耗時:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!) 本文由博客一文多發平臺 OpenWrite 發佈!