- 我的第一本算法書
- (日)宮崎修一 石田保輝
- 754字
- 2019-04-02 18:35:43
1-3 數(shù)組
數(shù)組也是數(shù)據(jù)呈線性排列的一種數(shù)據(jù)結(jié)構(gòu)。與前一節(jié)中的鏈表不同,在數(shù)組中,訪問數(shù)據(jù)十分簡單,而添加和刪除數(shù)據(jù)比較耗工夫。這和1-1節(jié)中講到的姓名按拼音順序排列的電話簿類似。
參考:1-1 什么是數(shù)據(jù)結(jié)構(gòu)
01

這就是數(shù)組的概念圖。Blue、Yellow、Red作為數(shù)據(jù)存儲在數(shù)組中。
02

數(shù)據(jù)按順序存儲在內(nèi)存的連續(xù)空間內(nèi)。
03

由于數(shù)據(jù)是存儲在連續(xù)空間內(nèi)的,所以每個數(shù)據(jù)的內(nèi)存地址(在內(nèi)存上的位置)都可以通過數(shù)組下標(biāo)算出,我們也就可以借此直接訪問目標(biāo)數(shù)據(jù)(這叫作“隨機(jī)訪問”)。
04

比如現(xiàn)在我們想要訪問Red。如果使用指針就只能從頭開始查找,但在數(shù)組中,只需要指定a[2],便能直接訪問Red。
05

但是,如果想在任意位置上添加或者刪除數(shù)據(jù),數(shù)組的操作就要比鏈表復(fù)雜多了。這里我們嘗試將Green添加到第2個位置上。
06

首先,在數(shù)組的末尾確保需要增加的存儲空間。
07

為了給新數(shù)據(jù)騰出位置,要把已有數(shù)據(jù)一個個移開。首先把Red往后移。
08

然后把Yellow往后移。
09

最后在空出來的位置上寫入Green。
10

添加數(shù)據(jù)的操作就完成了。
11

反過來,如果想要刪除Green……
12

首先,刪掉目標(biāo)數(shù)據(jù)(在這里指Green)。
13

然后把后面的數(shù)據(jù)一個個往空位移。先把Yellow往前移。
14

接下來移動Red。
15

最后再刪掉多余的空間。這樣一來Green便被刪掉了。
解說
這里講解一下對數(shù)組操作所花費的運行時間。假設(shè)數(shù)組中有n個數(shù)據(jù),由于訪問數(shù)據(jù)時使用的是隨機(jī)訪問(通過下標(biāo)可計算出內(nèi)存地址),所以需要的運行時間僅為恒定的O(1)。
但另一方面,想要向數(shù)組中添加新數(shù)據(jù)時,必須把目標(biāo)位置后面的數(shù)據(jù)一個個移開。所以,如果在數(shù)組頭部添加數(shù)據(jù),就需要O(n)的時間。刪除操作同理。
補充說明
在鏈表和數(shù)組中,數(shù)據(jù)都是線性地排成一列。在鏈表中訪問數(shù)據(jù)較為復(fù)雜,添加和刪除數(shù)據(jù)較為簡單;而在數(shù)組中訪問數(shù)據(jù)比較簡單,添加和刪除數(shù)據(jù)卻比較復(fù)雜。
我們可以根據(jù)哪種操作較為頻繁來決定使用哪種數(shù)據(jù)結(jié)構(gòu)。

- Python自動化運維快速入門
- INSTANT Weka How-to
- R的極客理想:工具篇
- Learning Python Design Patterns
- AppInventor實踐教程:Android智能應(yīng)用開發(fā)前傳
- 微服務(wù)從小白到專家:Spring Cloud和Kubernetes實戰(zhàn)
- Learning Apache Cassandra
- Practical Game Design with Unity and Playmaker
- Getting Started with Nano Server
- 硬件產(chǎn)品設(shè)計與開發(fā):從原型到交付
- 愛上C語言:C KISS
- JavaScript悟道
- 深度學(xué)習(xí)入門:基于Python的理論與實現(xiàn)
- INSTANT JQuery Flot Visual Data Analysis
- MySQL核心技術(shù)與最佳實踐