在 Rust 中插入向量有多复杂?

  • 本文关键字:复杂 向量 Rust 插入 rust
  • 更新时间 :
  • 英文 :


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,在添加所有值后,我执行排序和重复数据删除。

最新更新