算法快學筆記(二):數組與鏈表

1. 說明

當程序需要將數據存儲到內存時,計算機會給你一個存儲地址。需要存
儲多項數據時,有兩種基本方式——數組和鏈表。但它們並非都適用於所有的情形,因此知道它們的特性很重要。本文將對數組與鏈表的原理與優缺點進行總結。

2. 數組

使用數組存儲多個元素的時候,數組中元素的地址時刻都是挨在一起的,爲了便於理解,以看電影爲例進行說明。

你和你小夥伴的關係都非常的好,如果一起看電影必須要座位要挨在一起,你先和兩個小夥伴去看電影,到了電影院只坐有連續三個空位的地方(數組初始化)。找到地方就坐後又來了一位朋友,但原來坐的地方沒有空位置,這時只能重新找一個可坐下所有人的地方(數組插入新元素)。如果又來了一位朋友,而當前坐的地方也沒有空位,你們就得再次轉移!好不容易安穩的看了會電影,有個小夥伴又要離開,爲了讓大家都緊挨着,有一部分小夥伴就需要挪動下座位(數組刪除元素)。

真是太麻煩了。同樣,在數組中添加/刪除元素也很麻煩。因此數組添加/刪除元素的速度都會很慢。

對於新增元素的一種解決之道是“預留座位”:即便你們現在只有3個小夥伴,也請計算機提供10個位置,以防臨時有朋友來的情況。這樣,只要小夥伴不超過10個,就無需轉移。
該方案存在兩個缺點。

  • 你額外請求的位置可能根本用不上,這將浪費內存。你沒有使用,別人也用不了。
  • 待辦事項超過10個後,你還得轉移。

3. 鏈表

鏈表的每個元素都存儲了下一個元素的地址,從而使一系列隨機的內存地址串在一起,因此鏈表中的元素可存儲在內存的任何地方,當添加/刪除元素時其他的元素都不需要移動。同樣以看電影爲例對鏈表進行說明。

假設你與10位朋友去看一部很火的電影。你們11人想坐在一起,但看電影的人較多,沒有11個在一起的座位,如果是數組的解決方式,這個電影就看不了了,因爲實在沒有這麼多空的位置是在一起的。鏈表的解決方式是“既然這樣,我們分開來坐,但是爲大家之間還可能會聯繫,因此每個人都依次記得下一個人的座位號,例如A記得B的座位號是008,B記得C的座位號是102…”,因此,只要有足夠的內存空間,就能爲鏈表分配內存

4. 數組與鏈表的查詢

從看電影的例子可以看出,使用鏈表的方式,解決入場觀看(初始化),以及中途人員變動(新增/刪除)是一個比較好的方案,但是如果用來找你的小夥伴了?考慮以下兩種操作

4.1 全部查找

  1. 數組方式:由於所有小夥伴都做在一起,只要找到第一個,其他的就都能找到。
  2. 鏈表方式:雖然小夥伴都是分散做的,但是由於每個小夥伴都知道下一個小夥伴的座位號,因此要找全部小夥伴也比較方便

4.2 隨機查找

假設10個小夥伴的入場看電影的時候,是按照年齡從小到大的順序入場的,你突然要找年齡最大的那個小夥伴。

  1. 數組方式:由於所有小夥伴都做在一起,找到第一個人後,他的座位號+10就是年齡最大的那個小夥伴。
  2. 鏈表方式:由於小夥伴都是分散坐的,所以你只能從第一個人問第二個人的座位號,到第二個人那邊後,問他第三個人的座位號,以此類推。

通過上面的例子可以看出,在隨機讀取的場景:

  1. 需要隨機地讀取元素時,數組的效率很高,因爲可迅速找到數組的任何元素。
  2. 在鏈表中元素並非靠在一起的,你無法迅速計算出第i個元素的內存地址,而必須先訪問第一個元素以獲取第二個元素的地址,再訪問第二個元素以獲取第三個元素的地址,以此類推,直到訪問第i個元素。

5. 總結

  • 需要存儲多個元素時,可使用數組或鏈表。
  • 數組的元素都在一起。
  • 鏈表的元素是分開的,其中每個元素都存儲了下一個元素的地址。
  • 數組的隨機讀取速度很快。
  • 鏈表的插入和刪除速度很快。
  • 在同一個數組中,所有元素的類型都必須相同(都爲int、 double等)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章