假設理解 Big O 表示法。 JavaScript 中有範例。資料參考 Gayle Laakmann McDowell 的《Cracking the Coding Interview》
在 JavaScript 或 Python 等某些語言中,陣列會自動調整大小,這表示陣列會隨著您追加專案而成長。在 Java 等其他語言中,陣列是固定長度的,這表示陣列的大小是在初始化陣列時定義的。這些自動增長的陣列稱為動態數組。
在 Java 中,ArrayList 是一種類似陣列的資料結構,它提供動態調整大小的同時仍提供 O(1) O(1)n)O(n🎜> 1)1
)O(1)1 調整大小時,假設調整大小因子為 2,我們可以觀察到透過將前一個陣列加倍(即 N 的一半),我們增加到大小為 N 的陣列。此外,我們還需要複製
N/2N/22N/2N/2N/2 >N/2 元素添加到這個新數組。如果我們將從最終容量增加到第一次容量增加複製的元素數量相加: +> 🎜>n16+...+2+1壓裂{n}{2} + 壓裂{n}{4} + 壓裂{n}{8 } + 壓裂{n}{16} + ...+2 + 1 2nn+ 4n 🎜>+ 🎜>n161 其總和略小於 N。因此,插入 N 個元素大約需要
O(n)n)O(n🎜> O(n) 總共工作。每次插入都是 O(1)1)O(1) O(1) 平均而言,即使某些插入需要 O(n)n)O(n🎜> O(n) 最壞情況下的時間。 核心概念與大O複雜性 JavaScript 中的動態陣列通常有幾個核心方法,每個方法都有不同的時間複雜度: get(i):此方法會擷取索引 i 處的元素。
n
1
O
O
class DynamicArray { // size is # of filled slots while capacity is total slots in array constructor(capacity) { this.capacity = capacity; this.arr = new Array(this.capacity); this.size = 0; } // O(1) get(i) { if (i < 0 || i >= this.size) return undefined; return this.arr[i]; } // O(1) set(i, n) { if (i < 0 || i >= this.size) return undefined; this.arr[i] = n; } // O(1) amortized pushback(n) { if (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; this.size++; } // O(1) popback() { if (this.size === 0) return undefined; this.size--; let temp = this.arr[this.size]; this.arr[this.size] = undefined; return temp; } // O(n) resize() { this.capacity *= 2; let newArr = new Array(this.capacity); for (let i = 0; i < this.size; i++) { newArr[i] = this.arr[i]; } this.arr = newArr; } // O(1) getSize() { return this.size; } // O(1) getCapacity() { return this.capacity; } }
以上是實現動態數組的詳細內容。更多資訊請關注PHP中文網其他相關文章!