iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

開始進入到我們正式資料結構的環節了,首先我們先來介紹大家最熟悉的Array,Array就是一塊「連續的記憶體空間」,我們可以利用index去直接存取我們要的資料,這個「直接」就是O(1)的操作,在比較底層的C語言我們要宣告一個Array的時候就要先指定好型別跟大小,在比較高階的語言則不需要。

讀取

Array在日常生活中就好比有順序編號的格子,來一個最簡單的數學範例就可以知道為什麼他可以在O(1)取得我們要的資料,假設一個格子是3公分,我要拿編號5號格子的東西,我要怎麼拿呢?
https://ithelp.ithome.com.tw/upload/images/20220912/20151772Ufj7Ddl0L8.png

當然是去 3*(5-1) 公分處拿阿 ! 第N個東西呢,就在 3*(N-1)公分處拿,那為什麼我們可以簡簡單單用一個公式就算出來,最重要的原因就是,因為他是「連續」的,就是一個跟在一個後面的意思。
順帶一題,在圖片裡大家有沒有發現,第一個箱子的編號是0,這是因為當我們程式語言在使用index的時候,索引值都會從0開始而不是1呦,這邊大家要注意一下。

在程式實際上跑的時候我們剛剛所說的公分處,其實就是記憶體的位置,所以我可以套用剛剛的數學公式,到達指定位置後就能直接去存取目標的資料。

我們了解取值後,接下來我們來談談刪除與插入。

刪除

https://ithelp.ithome.com.tw/upload/images/20220912/20151772TrTCrUgIfL.png
試想今天我們要刪除一個格子我們要怎麼做,為了要保持其他格子的連續的特性,假設我要移除第5個格子後還要讓4跟6連在一起,那我只能去把6後面的都向前移動一格,讓原本的6移到5的位子接著7移到6的位子以此類推....。那如果我是刪除第一或第二格呢?我是不是就要移動整個Array了,所以刪除的時間複雜度會是O(n)。
https://ithelp.ithome.com.tw/upload/images/20220912/20151772H0EArP5RD6.png
https://ithelp.ithome.com.tw/upload/images/20220912/20151772khOGZYGW6V.png

插入

https://ithelp.ithome.com.tw/upload/images/20220912/20151772J7qG4JanZi.png
新增的想法跟刪除大同小異,如果要插入在第5格,我勢必要把第5格以後的都往後移動一格,那如果我是插入在第一格,我勢必要移動所有的格子,所以時間複雜度也是O(n)。
https://ithelp.ithome.com.tw/upload/images/20220912/20151772y1Q0QPWhrM.png

注意事項

在大多數語言中Array index都是從0開始,可能要稍微注意一下,另外還有一種情況是,你明明只有5個格子,但是你卻要存取第6個,那就會很容易出現Index out of range的Exception.
好的今天Array就介紹到這邊,大家可以好好玩一下呦。


上一篇
一步步來談時間複雜度
下一篇
資料結構-HashMap/Set
系列文
從演算法到解題思路,以Python為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言