計算機科學中,動態數組dynamic array),也稱為:可增長數組growable array)、可調大小數組 resizable array)、動態表格 dynamic table)、可變化數組mutable array)或數組列表array list),是一種隨機訪問的、大小可變的列表數據結構,它允許增加或移除元素。在很多現代主流程式語言中,它是通過標準庫而提供的。動態數組克服了靜態數組的限制,靜態數組有着需要在內存分配時指定的固定容量。

使用幾何擴張將一些值插入到動態數組的末端。灰白單元格指示留作擴張的空間。多數插入是快速的(常數時間),而某些插入因為需要內存分配而緩慢(Θ(n)時間,標示了烏龜)。展示了最終數組的「邏輯大小」和「容量」。

動態數組與動態分配的數組或可變長數組不是一種東西,可變長數組的大小是在分配這個數組的時候固定的,然而動態數組也可以使用這種固定大小的數組作為後端[1]

語言支持

編輯

C++std::vector英語Sequence container (C++)Ruststd::vec::Vec是動態數組的實現,還有ArrayList類,提供它的有Java API[2][3]:236.NET框架[4][5]:22

.NET框架版本2.0提供的泛型List<>類也是通過動態數組實現的。SmalltalkOrderedCollection時具有動態的開始與結束索引的動態數組,這使得移除第一元素也只需要O(1)時間。

Pythonlist數據類型實現了動態數組,其增長模式是:0, 4, 8, 16, 24, 32, 40, 52, 64, 76, ...,參見在github.com的listobject.c[6]

DelphiD在語言核心實現了動態數組。

AdaAda.Containers.Vectors泛型包提供了針對給定子類型的動態數組。

很多腳本語言比如PerlRuby提供了動態數組作為內建原始數據類型

一些跨平台框架為C語言提供動態數組實現,包括Core Foundation英語Core Foundation中的CFArrayCFMutableArray,和GLib中的GArrayGPtrArray

Common Lisp通過允許配置內建array類型為「可調整的」和通過「填充指針」指定插入位置,提供了對可變大小向量的初步支持。

參見

編輯

引用

編輯
  1. ^ See, for example, the source code of java.util.ArrayList class from OpenJDK 6.
  2. ^ Javadoc on ArrayList
  3. ^ Bloch, Joshua. "Effective Java: Programming Language Guide" third. Addison-Wesley. 2018. ISBN 978-0134685991. 
  4. ^ ArrayList Class
  5. ^ Skeet, Jon. C# in Depth. Manning. ISBN 978-1617294532. 
  6. ^ listobject.c (github.com)

外部連結

編輯