将元素插入到有序向量中的最有效方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将元素插入到有序向量中的最有效方法是什么?相关的知识,希望对你有一定的参考价值。

我有一个排序的v: Vec<EventHandler<T>>,我想在保持排序的同时插入一个元素。最有效的方法是什么? Rust似乎没有内置的方法来做到这一点。

EventHandler<T>如下:

struct EventHandler<T: Event + ?Sized> {
    priority: i32,
    f: fn(&mut T),
}

由于排序的工作方式,使用O(n log n) time complexity and 2*n allocation cost进行插入和排序效率低下。

答案

该任务包括两个步骤:使用binary_search查找插入位置并使用Vec::insert()插入:

match v.binary_search(&new_elem) {
    Ok(pos) => {} // element already in vector @ `pos` 
    Err(pos) => v.insert(pos, new_elem),
}

如果要在向量中允许重复元素,从而希望插入已存在的元素,则可以将其写得更短:

let pos = v.binary_search(&new_elem).unwrap_or_else(|e| e);
v.insert(pos, new_elem);

但是:请注意,这具有O(n)的运行时复杂性。要插入到中间,向量必须将插入位置右侧的每个元素向右移动。

因此,您不应该使用它将多个元素插入到矢量中,该矢量的大小不小。特别是,您不应该使用此方法对矢量进行排序,因为此插入排序算法在O(n²)中运行。

在这种情况下,BinaryHeap可能是更好的选择。每个插入(push)的运行时复杂度仅为O(log n)而不是O(n)。如果你愿意,你甚至可以将它转换成Vec的排序into_sorted_vec()。您也可以继续使用堆而不是转换它。

以上是关于将元素插入到有序向量中的最有效方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

从长(且合理)稀疏向量中选择随机元素的最有效方法是啥?

在R中的排序向量中获取索引的最有效方法?

C++ 将大量向量转换为字符向量的最有效方法

将数千条记录插入表中的最有效方法是啥(MySQL,Python,Django)

迭代数组并在索引处插入元素

JavaScript笔试题(js高级代码片段)