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

时间:2016-03-27 16:20:34

标签: rust

我有一个排序reltool.config,我希望在保持排序的同时插入一个元素。最有效的方法是什么? Rust似乎没有内置的方法来实现它。

v: Vec<EventHandler<T>>如下:

EventHandler<T>

由于排序的工作原理,使用release handler插入和排序效率很低。

1 个答案:

答案 0 :(得分:12)

该任务包括两个步骤:使用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()。您也可以继续使用堆而不是转换它。