1. 程式人生 > >資料結構與演算法(一)--- 資料結構與演算法概念

資料結構與演算法(一)--- 資料結構與演算法概念

一、資料結構

資料結構是計算機儲存、組織資料的方式。(資料結構是指資料與資料之間的關係。)

資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。

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;
}