对向量中的一个元素进行排序的最有效方法
Most efficient way to sort one element in a vector?
我有一个元素向量,这些元素根据一些外部值进行排序。它是一个大容器,查找排序值相对昂贵。在某些时候,一个元素(仅)需要重新排序。重新排序该元素的最有效方法是什么? 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:出于其他性能原因,容器需要成为矢量
如果要
将元素直接插入排序向量中的正确位置,则应使用upper_bound
获取迭代器并将其传递给insert
以将元素放置在正确的位置:
vec.insert(std::upper_bound(vec.begin(), vec.end(), item), item);
请注意,upper_bound
会很快(O(log n)
),但插入可能会很慢(O(n)
),因为它必须移动插入点之后的所有元素。
但是,在向量末尾插入并调用std::sort
是O(n log n)
所以这是最糟糕的,至少在大向量上是这样!
vec.insert(item);
std::sort(vec.begin(), vec.end());
另一种选择可能是插入向量的末尾,然后与前一个元素一起移动,直到它更低或相等。在这种情况下,插入物O(1)
摊销,您必须进行O(n)
掉期。
恐怕不会有像list
那样O(log n)
解决方案.
你可以使用这样的东西:
std::sort(myvector.begin(), myvector.end)
认为它s part of STL and it
实施得很好。
考虑将值存储在 MAP 中。
您可以查看 101010 的答案。我认为这是非常解释性的。你可以用你的案例来分析这一点。
相关文章:
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- 如何使用C++有效地合并排序与向量
- 随机化超大文件内容排序的有效方法是什么?
- 相对于另一个向量对一个向量进行排序 - 最有效的方法
- 何时有效使用存储桶排序以及需要多少存储桶
- 如何有效地对__m256i向量的字节进行重新排序(将int32_t转换为uint8_t)?
- 在排序字符串向量中进行有效搜索
- 当有多个查询时,检查某些子数组是否排序的有效方法是什么?
- C++基数排序的有效方法
- 有效地添加到排序的队列中
- 气泡排序不完全有效
- 合并排序程序总是有效的,但有时会在最后说中止陷阱
- 仅使用几乎相等的标准(无排序)从容器中删除重复项的最有效方法是什么
- 对内存中的大向量进行排序的有效方法
- C++中向量的向量中索引的最有效排序
- 插入最有效的数据结构,然后使用不同的条件进行排序
- 一种在c++中对数组进行bin排序的有效方法
- 最高有效位基数排序如何比最低有效位基数分类更有效
- Cuda有效地将数据插入到未排序的填充数组中
- 在c++中为嵌入式系统排序有效和无效的数字数组