- 秒懂算法:用常識解讀數據結構與算法
- (美)杰伊·溫格羅
- 1028字
- 2022-10-08 17:10:04
1.4 讀取
首先來看讀取操作。讀取操作可以檢查數組內某一索引處的值。
計算機從數組中讀取僅需要1步。這是因為計算機有能力跳到任意索引的位置,并檢查它的值。在["apples", "bananas", "cucumbers", "dates", "elderberries"]
這個數組中,如果要檢查索引2,那么計算機就會立刻跳轉到索引2,并報告它的值"cucumbers"
。
為什么檢查數組的索引只需要1步呢?原因如下。
計算機的內存就像一大堆格子。在下圖中,你可以看到一堆格子,有些是空的,有些包含數據。

雖然這只是計算機內存工作原理的簡化示意圖,但其本質的確如此。
當程序聲明數組時,會分配一段連續的空格子供其使用。如果你要創建一個存儲5個元素的數組,那么計算機就會找5個連續的空格子,作為數組使用,如下圖所示。

計算機內存的每個格子都有一個地址。這有點兒像街道地址(比如中央大街123號),但它是用數字表示的。每個格子的內存地址都比前一個格子大1,如下圖所示。

下圖給出了購物清單數組的索引和內存地址。

當計算機讀取數組中某一索引的值時,能直接跳轉到那個索引,因為它具有如下特性。
(1) 計算機可以一步跳轉到任意內存地址。如果讓計算機檢查內存地址1063存儲的數據,那么無須做任何搜索它就能直接讀取那個值。打個比方,如果我叫你伸出右手小拇指,那么不需要搜索所有手指你也知道是哪一根。你馬上就能找到它。
(2) 當計算機將內存分配給數組時,它會記錄數組從哪個內存地址開始。如果讓計算機尋找數組的第一個元素,那么它立刻就能跳轉到對應的內存地址并找到它。
這兩點解釋了為什么計算機只用1步就能找到數組的第一個值。計算機只要再做一個簡單的加法,就能找到任意索引的值。如果讓計算機尋找索引3的值,那么它只需在索引0的內存地址上加3即可。(畢竟內存地址是連續的。)
下面以購物清單數組為例。這個數組開始于內存地址1010。如果讓計算機讀取索引3的值,它就會經歷如下過程。
(1) 數組開始于索引0,其內存地址是1010。
(2) 索引3就在索引0的3個格子之后。
(3) 因為1010 + 3等于1013,所以可以合理推測索引3就在內存地址1013。
一旦計算機知道索引3位于內存地址1013,就能直接跳轉過去,讀取其中的值"dates"
。
因為計算機讀取任意索引只需要跳轉到其內存地址這一步,所以數組讀取是一個高效的操作。盡管我把計算機的思維過程分為3步,但是我們目前只關注跳轉到內存地址這一主要步驟。(后續章節會探究如何確定值得關注的步驟。)
只需要1步的操作自然是最快的操作。作為基本數據結構之一,數組正是因為其高效的讀取而大顯神通。
假如不是詢問計算機索引3的值,而是反過來問"dates"
的索引呢?這就是接下來要講的查找操作了。