開始進入到我們正式資料結構的環節了,首先我們先來介紹大家最熟悉的Array,Array就是一塊「連續的記憶體空間」,我們可以利用index去直接存取我們要的資料,這個「直接」就是O(1)的操作,在比較底層的C語言我們要宣告一個Array的時候就要先指定好型別跟大小,在比較高階的語言則不需要。
Array在日常生活中就好比有順序編號的格子,來一個最簡單的數學範例就可以知道為什麼他可以在O(1)取得我們要的資料,假設一個格子是3公分,我要拿編號5號格子的東西,我要怎麼拿呢?
當然是去 3*(5-1) 公分處拿阿 ! 第N個東西呢,就在 3*(N-1)公分處拿,那為什麼我們可以簡簡單單用一個公式就算出來,最重要的原因就是,因為他是「連續」的,就是一個跟在一個後面的意思。
順帶一題,在圖片裡大家有沒有發現,第一個箱子的編號是0,這是因為當我們程式語言在使用index的時候,索引值都會從0開始而不是1呦,這邊大家要注意一下。
在程式實際上跑的時候我們剛剛所說的公分處,其實就是記憶體的位置,所以我可以套用剛剛的數學公式,到達指定位置後就能直接去存取目標的資料。
我們了解取值後,接下來我們來談談刪除與插入。
試想今天我們要刪除一個格子我們要怎麼做,為了要保持其他格子的連續的特性,假設我要移除第5個格子後還要讓4跟6連在一起,那我只能去把6後面的都向前移動一格,讓原本的6移到5的位子接著7移到6的位子以此類推....。那如果我是刪除第一或第二格呢?我是不是就要移動整個Array了,所以刪除的時間複雜度會是O(n)。
新增的想法跟刪除大同小異,如果要插入在第5格,我勢必要把第5格以後的都往後移動一格,那如果我是插入在第一格,我勢必要移動所有的格子,所以時間複雜度也是O(n)。
在大多數語言中Array index都是從0開始,可能要稍微注意一下,另外還有一種情況是,你明明只有5個格子,但是你卻要存取第6個,那就會很容易出現Index out of range的Exception.
好的今天Array就介紹到這邊,大家可以好好玩一下呦。