JavaScript 的資料結構和演算法 - 陣列篇

MasterShu發表於2019-12-14

陣列應該算是人人都知道的吧。

這就是陣列

陣列其作為程式語言的資料型別,被很多語言支援的。然而不僅如此,它還是一種基礎的資料結構

- 線性表結構
- 用一組連續的記憶體空間,來儲存一組具有相同型別的資料

根據上述陣列的特性就可得,連續的空間意味著你可以隨機訪問,其元素訪問的時間複雜度為 O(1)。 但是同時也會帶來一些侷限性。

- 插入需要調整其插入位置之後的所有資料
- 同理,刪除也是會存在類似的情況。

陣列的插入和刪除平均時間複雜度就在 O(n)。

這麼看來,陣列還是蠻簡單的哈。沒錯,是這樣。不過你別驕傲,陣列就是基礎。如果連這都不會,接下能做的 可能真的就是從入門到放棄了。

陣列你還應該

陣列是一次直接申請到一組連續的空間,這就意味著,當空間不足時,你就會需要擴充套件你的空間了,怎麼擴充套件, 重新申請一組雙倍大小的連續空間(當然這兒的雙倍是大家常用手段)。

當然,你以為這就完了,你還要考慮到,當一個操作需要擴充套件是,也會涉及到轉移資料的問題,一次性的大量資料 遷移,你覺得會不會帶來新的問題呢?

大家都知道,CPU 都會對陣列的操作進行最佳化,這就意味著,有些時候相同的條件下,陣列會比其他資料結構更 具有優勢。

真的夠了嗎?

接下來說一些不是很常見的話題,或許這些你也都知道。別急,你可以直接跳過了(雖然你不知道我要說什麼,自信 就完了)。

陣列其實還是有很多理解的,比方我再剛開始介紹陣列時提到的,它是程式語言的資料型別,還是資料結構。 這就意味著,程式語言的資料型別是由資料結構實現的。可是也會存在資料型別由雜湊表、連結串列、搜尋樹或其他 資料結構實現。有沒有感覺有點兒不一樣了,說好的不是這樣的啊。

在演算法的理解中,它更應該是一種理論上電腦科學模型,專注於陣列的基本性質上。這樣的話,你就能理解某些 程式語言上的陣列和上述的描述會有點兒出入了。

二維陣列,是不是沒想到,數學上,我們稱之為 矩陣。
多維陣列,這個是不是就更不好理解了,嘿嘿。
動態陣列,這個是不是也懵逼的。

其實像上面說的,都是對一維陣列,也就是上面說的 陣列 的擴充套件,你現在不明白沒關係(因為目前我也沒有 很通透的熟悉完所有的陣列),隨著後面的展開,你會更加了解和熟悉的。陣列是很基礎的資料結構, 它的特性一定要了然如胸,不然後面的資料結構和演算法的內容會有點兒吃力,這是不好的現象。

因為本系列的課程主要都是圍繞著 JavaScript 的資料結構和演算法的,所以可能本系列對應的程式碼實現和前面 文字描述的會有一些出入,請參考剛才說的,你就明白是為什麼。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
路漫漫其修遠兮,吾將上下而求索。

相關文章