在Rust中插入向量的复杂性是什么?

时间:2018-05-14 22:35:08

标签: rust

insert如何在Rust Vec中工作?在具有数十亿个元素的非常大向量的开头插入元素效率有多高?

2 个答案:

答案 0 :(得分:3)

The documentation lists the complexities for all the standard collections and operations

  

在整个文档中,我们将遵循一些约定。对于   在所有操作中,集合的大小由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会更好(或找到不同的算法)。

答案 1 :(得分:0)

发现了这个问题,需要添加一个东西。

这完全取决于您的使用情况。如果要插入一次,可能值得接受O(n)。如果您随后使用O(1)进行数百万次的获取请求。

其他数据类型可能具有更好的插入时间,但具有O(log(n))甚至O(N)来获取项目。

接下来的事情是迭代,其中对于Vector这样的大型数组,缓存友好性将发挥作用。

可能的建议:如果您要插入一次然后执行很多请求,请继续使用Vec。 如果插入和删除是您的主要任务(例如队列),请执行其他操作。

我经常发现自己处于需要排序数组然后再选择Btreemap或BTreeSet之类的情况。我完全删除了它们,现在使用了Vec,在添加所有值之后,我进行了排序和重复操作。