JavaScript數據結構之鏈表

在說鏈表以前,先來康康基本數據結構--數組--
node

數組的特性以及優缺點

數組:在計算機科學中,數組數據結構,簡稱數組,是由相同類型的元素的集合所組成的數據結構,分配一塊連續的內存來存儲。利用元素的索引能夠計算出該元素對應的存儲地址。 最簡單的數據結構類型是一維數組。數組-維基百科數組

數組的特性:
數據結構

  • 存儲在物理結構上是連續的。數組所佔用的內存空間必須是連續的,不能由兩個或多個內存碎片存儲。
  • 底層的數組長度是不可變的。爲何說是底層的數組?由於JavaScript這類特殊的語言,像Java、Python等語言中聲明數組時必須指定數組的長度,而且指定長度以後長度不可變化,若是對超過數組長度的內存進行操做會發生數組越界異常;而JavaScript中在聲明數組時能夠不指定數組長度,而且能夠隨意操做數組(添加、刪除),緣由是js引擎在數組長度不夠時進行了數組擴容

數組擴容:當數組長度不夠用須要擴容時,此時須要系統從新分配一塊擴容後長度的物理空間,而後將擴容前的數組元素複製到新的物理空間中,這個過程是消耗性能的。尤爲是在數據量較大時,因此儘量避免發生數組擴容。性能

  • 數組的變量指向了數組的第一個元素。好比聲明一個數組arr,那麼arr其實指向的是數組的第一項的內存地址,因爲在內存中數組是連續的,能夠經過數組的第一項來訪問整個數組中的全部元素。

數組的優勢:this

  • 查詢性能好,在查詢某個位置的元素時尤其明顯,因爲數組在內存地址中是連續的,而且咱們經過arr[2]訪問數組中的某個元素時,arr[n]其中的n其實爲內存地址的偏移量,在操做系統中經過偏移量來進行查詢效率是最高的。

數組的缺點:spa

  • 因爲數組存儲必須使用連續的物理空間,那麼在數據量較大或者系統空間碎片較多時不易存儲。
  • 因爲數組長度定長,在對數組進行操做(插入、刪除)時會帶來性能的損耗。當在數組中間的某個部位插入或者刪除一個元素時,此時須要將該位置後面的全部元素進行後移/前移,當數據量較大時性能損耗較大。

什麼是鏈表

鏈表:鏈表是一種常見的基礎數據結構,是一種線性表,可是並不會按線性的順序存儲數據,而是在每個節點裏存到下一個節點的指針。因爲沒必要須按順序存儲,鏈表在插入的時候能夠達到O(1)的複雜度,比另外一種線性表順序錶快得多,可是查找一個節點或者訪問特定編號的節點則須要O(n)的時間,而順序表相應的時間複雜度分別是O(logn)和O(1)。鏈表-維基百科操作系統

鏈表有單鏈表、雙鏈表、循環鏈表,這裏只介紹單鏈表。指針

使用JavaScript來建立一個簡單的鏈表結構:code

function Node(value) {
    this.value = value;
    this.next = null;
}
let node1 = new Node(1);
let node2 = new Node(2);
let node3 = new Node(3);
let node4 = new Node(4);
let node5 = new Node(5);

let head = node1;

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
複製代碼

鏈表的特性:cdn

  • 在空間上不是連續的。
  • 每存放一個值都會浪費一個引用空間。

注:

  • 傳遞鏈表必須傳遞鏈表的根節點(head)。
  • 每個節點都認爲本身爲根節點,不包含上一個節點的任何信息。

鏈表的優勢:

  • 只要內存足夠大,不用擔憂空間碎片的問題。
  • 鏈表的添加刪除很是容易(只需更改引用便可)。 好比在節點b和節點c之間想插入一個節點d,只需將節點b的引用指向節點d,而後將節點d的引用指向節點c便可。

鏈表的缺點:

  • 查詢速度慢, 查詢某個節點或者特定編號節點須要O(n)的時間
  • 會浪費一些空間。 每添加一個節點都須要建立一個引用來指向下一個節點(當節點內的數據量越大時這部分開銷對內存的影響越小)

未完待續。。。

相關文章
相關標籤/搜索