【发布时间】:2016-07-07 00:30:48
【问题描述】:
我有一个元素向量,这些元素是根据一些外部值排序的。它是一个大容器,查找排序值相对昂贵。在某些时候,一个元素(仅)需要重新排序。重新排序该元素的最有效方法是什么? std::sort() 向量?擦除插入元素?将元素与其直接邻居进行比较?
编辑:澄清一下,通过擦除插入元素我的意思是这样的:
// erase the key and then insert-sort it
auto iter = std::find(keys.begin(), keys.end(), key);
keys.erase(iter);
SortedInsert(keys, index, <cmp>);
EDIT2:出于其他性能原因,容器需要是向量
【问题讨论】:
-
您的意思是在现有的排序向量中插入一个值吗?
-
最坏的情况是 O(n) 复杂度(一个元素从末尾移动到开头)-您可能需要另一种数据结构(可能是
std::set?) -
关于 sorted
vectorvs.set的论点,一篇有趣的文章:asawicki.info/news_1352_the_beauty_of_sorted_arrays.html -
既然你问如何快速做到这一点,我假设你会经常这样做以产生影响。在这种情况下,您应该解决这个问题,因为它会很慢。例如,您可以拥有额外的未排序向量,当它足够大后,您会将其重新组织到您的排序向量中 - 大成本通过多次插入分摊。