為什麼陣列索引的存取是常數時間複雜度 O(1)

可能只有我不知道,但是不記下來又覺得需要解釋的時候會解釋不出來。

陣列是在程式設計中常見的資料結構,將多個固定大小的元素存放在連續的記憶體位址中,而這段記憶體的起始位址是已知的。當要存取陣列中的某個元素時就能透過起始位址加上偏移量來計算出目標元素的記憶體位址,而不需要一個一個的走訪所有元素去找出目標元素。

另外,Why is indexing faster than binary search 這篇文章提到這件事背後與硬體運作有關。

計算目標元素的記憶體位置公式如下:

1
元素位址 = 起始位址 + (目標索引 × 元素大小)

由於計算元素位址的過程不依賴於陣列的大小,而僅涉及一次計算操作,因此無論索引大小如何,這個操作的時間都是固定的。這就是為什麼說陣列索引的存取時間複雜度是 O(1),即常數時間複雜度。

結論

這是個很小的知識點,寫出來比較像是備忘並幫助我理清思緒,而需要回答這個問題時也能比較順暢的回答。 另一方面參考資料中有很多圖文並茂且深入的講解,透過連結記錄起來需要時也能更深入的了解。

參考

How accessing an array element is constant time ?
Why does accessing an Array element take O(1) time?
Why is Array Access Constant Time
Why is indexing faster than binary search