Easyfun Easy fun Easy to play

資料結構

資料結構

一想到資料結構就感到很複雜的一些觀念 最早使用電腦的主因是要用來儲存及管理一些資料,這也是資料結構觀念的由來。當我們要求電腦解決問題時,必須以電腦了解的模式來描述問題,資料結構是資料的表示法,也就是電腦中儲存資料的方法。

認識資料結構

資料結構就是資料進入電腦化處理的一套完美邏輯。像程式設計師必須用資料結構來進行資料的新增、刪除、修改、儲存等動作,如果在選擇資料結構時做了錯的選擇,那你整個程式會變得沒效率或者變慢,甚至選錯資料型態那真的是會埋了更大的雷。

例如:圖書館會建立所有書的資料,管理人員會依照各個不同的書做種類分類,如年齡分級、書籍類型、作者或主題。分類好把檔案存起來日後有人要來借書時,只要查詢書籍類型作者名稱這樣,即可快速找出所需的書,而這些儲存的分類就是資料結構概念的一種。

資料與資訊

先了解一下資料(Data)與資訊(Information)的定義。

資料是指為基處理的文字、數字、符號、圖形等等。還可以再分為兩大類,

  • 數值資料(Numeric Data):就是一般的數值,可用運算子來做運算

  • 文數資料(Alphanumeric Data):像是非數值資料,像是我們看到的地址身分證號碼等等

資訊是將大量的資料,經過有系統的整理、分析、篩選處理,具有參考價值和可用性。

資料結構主要是表示資料在電腦記憶體中所儲存的位置和模式,可分為三種型態:

  • 基本資料型態(Primitive Data Type)

無法以其他型態定義的資料型態,也稱為純量資料型態,程式語言都會提供基本資料,例如:Rust中的基本資料型態,包括整數、浮點數、布林、字符、陣列等等。

  • 結構化資料型態(Structured Data Type)

也稱為虛擬資料型態,比基本資料型態更高一層,例如:結構、列舉等等。

  • 抽象話資料型態(Abstract Data Type)

對一種資料型態,可將其看成是一種值的集合,以及在這些值上所作的運算與本身代表屬性成的集合。抽象資料型態所代表便是定義這種資料型態所具備的數學關係。

資料結構的種類

資料結構可透過程式語言提供有效的型別、參照及其他操作。我們知道一個程式能否快速而有效率的完成任務,取決是否選對了資料結構,而程式是否能清楚而正確的把問題解決,取決於演算法。

資料結構加上演算法等於有效率、可執行的程式。

alt text

不同種類的資料結構適合不同種類的應用,用適當的資料結構可讓演算法發揮最大效能。接下來會介紹常見的資料結構。

陣列(Array)

陣列結構是一排緊密的可數記憶體,並提供能夠直接存取單一資料計算方法。 像是每戶的信箱,每個信箱有地址,路名就是名稱,信箱號碼就是索引,可以依照信件上的住址投到信箱,陣列的名稱是表示一塊緊密相鄰記憶體的起始位置,而陣列的索引功能則是用來表示從此記憶體起始位置的第幾個區塊。

alt text

陣列的使用可分為一維陣列、二維陣列與多維陣列等等

alt text

二維陣列

二維陣列可視為一維陣列的延伸,都是處理相同型態資料,差別只在維度的宣告。

例如:一個含有x * y個元素的二維陣列,x代表列數,y代表行數

alt text

在Rust二維宣告格式:

資料型態 二維陣列名 [列大小] [行大小];

// 4X4
let mut arr: [[32; 4]; 4]

這邊是用[]括住每一列的初始值,並以;區隔每個陣列元素

// 2X3
let mut arr: [[i32; 3]; 2] = [[0, 1, 2], [3, 4, 5]];

三維陣列

三維跟二維一樣,可視為是一維陣列的延伸,陣列為三維陣列時,可看作一個立方體,像是魔術方塊一樣。

alt text

上圖就像是arr[2][3][4]三維陣列成魔術方塊。

fn main() {
    // 宣告一個3x3x3的整數三維陣列
    let arr: [[[i32; 3]; 3]; 3] = [
        [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
        [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
        [[19, 20, 21], [22, 23, 24], [25, 26, 27]],
    ];

    // 三維陣列
    for x in 0..3 {
        for y in 0..3 {
            for z in 0..3 {
                print!("{} ", arr[x][y][z]);
            }
            println!();
        }
        println!();
    }
}

會印出

1 2 3

4 5 6

7 8 9

10 11 12

13 14 15

16 17 18

19 20 21

22 23 24

25 26 26