TypeScript算法與數據結構-數組篇

本文的源碼在個人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);
    }
}

1.在數組中插入元素

在數組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倍處理,這個我後面會專門說起學習

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];
}

3.在數組中刪除元素

在數組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

4.數組的擴容或者縮容

數組的擴容和縮容操做很簡單,原理就是接受一個新的容量,把以前數組中的內容複製到新數組中,並返回新的數組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~

相關文章
相關標籤/搜索