insert
如何在 RustVec
中工作?在具有数十亿个元素的非常大的向量的开头插入元素的效率如何?
文档列出了所有标准集合和操作的复杂性:
在整个文档中,我们将遵循一些约定。为 所有操作,集合的大小用
n
表示。如果另一个 集合涉及操作,它包含m
元素。 具有摊销成本的操作后缀为*
。 具有预期成本的操作后缀为~
。get(i) insert(i) remove(i) append split_off(i) Vec O(1) O(n-i)* O(n-i) O(m)* O(n-i)
Vec::insert
的文档解释了细节,强调我的:
矢量内的位置
index
处插入元素,将它之后的所有元素向右移动。
在具有数十亿个元素的非常大的向量的开头插入元素的效率如何?
一个非常糟糕的主意,因为一切都需要移动。也许VecDeque
会更好(或找到不同的算法(。
找到这个问题,需要添加一件事。
这完全取决于您的使用情况。如果你插入一次,也许值得接受O(n(。如果你然后使用 O(1( 执行数百万个 get 请求。
其他数据类型可能具有更好的插入时间,但具有 O(log(n(( 甚至 O(N( 来获取项目。
接下来是迭代,缓存友好性在如此大的数组中发挥作用,其中 Vector 是完美的。
五月建议:如果你插入一次,然后做很多请求,请继续使用 Vec。 如果插入和删除是您的主要任务,例如队列,请选择其他操作。
我经常发现自己在某些情况下需要排序数组,然后选择Btreemap或BTreeSet之类的东西。我完全删除了它们,现在使用了 Vec,在添加所有值后,我执行排序和重复数据删除。