資料結構與演算法(一)--- 資料結構與演算法概念
阿新 • • 發佈:2018-12-10
一、資料結構
資料結構是計算機儲存、組織資料的方式。(資料結構是指資料與資料之間的關係。)
資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。
1、邏輯結構
邏輯結構 | 示意圖 |
---|---|
1、集合結構 | |
2、線性結構 | |
3、樹形結構 | |
4、圖形結構 |
2、儲存結構
儲存結構:儲存在計算機裡面的結構
儲存結構 | 描述 |
---|---|
1、陣列 | 相同型別、若干變數、有序 |
2、散列表(雜湊表) | 儲存在f(key) |
3、連結串列 | 非連續、非順序、連結串列指標(資料域,指標域) |
4、堆疊 | 先進後出 |
5、佇列 | 先進先出 、後進後出 |
6、樹 | 根、結點、葉子;前驅,後繼;【e.g.】二叉樹 |
7、圖 | 結點(頂點)、邊 |
二、演算法
演算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。
演算法複雜度 | 描述 |
---|---|
1、空間複雜度 | 執行時佔用多少記憶體 |
2、時間複雜度 | 執行時佔用多少時間,主要研究關鍵程式碼執行次數。表示:O(n) 。 【例】O(n) = n2 + 3n + 100 ==> O(n) = n2 【例】O(n) = n5 + n4 + n ==> O(n) = n5 |
【例1】
時間複雜度:O(n) = n2
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// TODO do something
}
}
【例2】
時間複雜度:O(n) = n2 + n + 1 ≈ n2
時間複雜度研究的是n => ∞,所以【例1】和【例2】的時間複雜度是一樣的。
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// TODO do something
}
}
for (int i = 0; i < n; i++) {
// TODO do something
}
// TODO do something
三、判定程式的好壞
程式 = 資料結構 + 演算法
程式好壞 = 空間複雜度 + 時間複雜度 + 【應用場景】
【例1】swap (✔️)
定義一個臨時變數實現兩個數交換,可讀性最好。
public void swap() {
int a = 5;
int b = 6;
int temp = a; // 定義一個臨時變數
a = b;
b = temp;
}
【例2】swap (×)
節省了一個空間,但是如果是物件,無法實現兩個數交換。
public void swap() {
int a = 5;
int b = 6;
a = a + b;
b = a - b;
a = a - b;
}
【例3】swap (×)
效能最優,支援物件交換,但是可讀性差。適合對記憶體要求高,比如無人機,跑步機等
public void swap() {
int a = 5;
int b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;
}