本文的源碼在個人github,能夠參考一下git
數組是數據結構中最簡單,也是使用最普遍的一種。在原生的js中,數組給咱們提供了不少方便的操做方法,好比push()
, pop()
, shift()
, unshift()
。可是出於對數據結構的學習,咱們將不使用這些已有的方法,而是本身實現這些方法。這樣也方便咱們計算其時間複雜度。這裏咱們選擇使用TypeScript
實現,主要是由於TypeScript的強類型控制,以及泛型這些高級特性。github
先來看咱們本身實現數組的實例屬性以及構造函數,咱們用capacity來表示數組的容量,雖然在TypeScript中並無像Java那樣嚴格限定數組長度,但咱們仍然但願儘可能接近Java。咱們用size來表示當前數組中元素的個數數組
class MyArray<T> { private data: Array<T>; private size: number = 0; constructor(capacity = 10) { this.data = new Array(capacity); } }
在數組index位置插入元素是咱們常常使用的一個操做,那咱們就須要從以前數組中index位置開始,每一個元素向後移動一個位置。以便給新插入的元素挪出位置。在操做的末尾,咱們須要維護一下數組的size.數據結構
public add(index: number, e: T) { if (index < 0 || index > this.size) { throw new Error('Add failed. Required index >= 0 and index <= size.'); } if (this.size === this.data.length) { this.resize(2 * this.data.length); } for (let i = this.size - 1; i >= index; i--) { this.data[i + 1] = this.data[i]; } this.data[index] = e; this.size++; }
在數組中添加元素,最好狀況下,用戶只用操做一次,時間複雜度是O(1);最差的狀況下,用戶須要操做size次,時間複雜度是O(n)函數
這裏有一點須要注意,當數組當前元素的個數size和capacity相等時,咱們須要給數組進行擴容爲2倍處理,這個我後面會專門說起學習
這個沒啥好說的,查詢和修改數組中某個元素複雜度就是O(1)ui
public get(index: number): T { if (index < 0 || index >= this.size) { throw new Error('Get failed. Index is illegal.'); } return this.data[index]; }
在數組index位置刪除元素,這裏咱們須要把數組從index+1位置開始,每一個元素向前移動一個元素this
public remove(index: number): T { if (index < 0 || index >= this.size) { throw new Error('Remove failed. Index is illegal.'); } let ret = this.data[index]; for (let i = index + 1; i < this.size; i++) { this.data[i - 1] = this.data[i]; } this.size--; this.data[this.size] = undefined; // 若是數組中的元素僅爲數組容量的1/4時,這時須要進行縮容操做 if (this.size === this.data.length / 4 && this.data.length / 2 !== 0) { this.resize(this.data.length / 2); } return ret; }
在數組中刪除元素,最好狀況下,用戶只用操做一次,時間複雜度是O(1);最差的狀況下,用戶須要操做size次,時間複雜度是O(n)
當數組中的元素個數僅爲數組容量的1/4時,咱們須要對數組進行縮容爲1/2操做code
數組的擴容和縮容操做很簡單,原理就是接受一個新的容量,把以前數組中的內容複製到新數組中,並返回新的數組blog
private resize(newCapacity: number): void { let newData = new Array(newCapacity); for (let i = 0; i < this.size; i++) { newData[i] = this.data[i]; } this.data = newData; }
更多相關數據結構,能夠前往個人github。持續更新中,喜歡的話給個star~