【发布时间】:2011-06-17 14:18:27
【问题描述】:
我实现了一个可调整大小的索引集合,它使用数组来存储其元素(如 .NET 中的 List<T> 或 Java 中的 ArrayList)在集合末尾有 amortized O(1) insertion time。但是,在集合刚刚达到其容量并且下一次插入需要将内部数组中的所有元素的完整副本复制到新的(大概是原来的两倍)。
一个常见的错误(在我看来)是使用链表来“修复”这个问题;但我相信为每个元素分配一个节点的开销可能是相当浪费的,事实上,在数组插入代价高昂的罕见情况下,保证 O(1) 插入的好处会相形见绌——事实上,每个 other 数组插入要便宜得多(而且速度更快)。
我认为可能有意义的是一种由数组链表组成的混合方法,每次当前“头”数组达到其容量时,都会将两倍大的新数组添加到链表中。然后不需要复制,因为链表仍然有原始数组。本质上,这似乎类似于(对我而言)List<T> 或 ArrayList 方法,除了以前在任何地方都会产生复制内部数组的所有元素的成本,在这里你只会产生分配 new 数组加上单个节点插入。
当然,如果需要,这会使其他功能复杂化(例如,在集合中间插入/删除);但正如我在标题中所表达的,我真的只是在寻找一个add-only(和迭代)集合。
是否有任何数据结构非常适合此目的?或者,你能自己想一个吗?
【问题讨论】:
标签: arrays performance data-structures language-agnostic big-o