【发布时间】:2015-08-28 16:47:27
【问题描述】:
我需要从一个大小为 800 万的大型未排序向量中删除重复项,该向量具有以下形式:
vector<unsigned> unsortedVec;
删除重复项后,我需要保留未排序元素的位置。例如,如果我的 unsortedVec 是:
6,98,1,938,98,736,0,1
那么在删除重复项后,我未排序的向量应该是:
6,98,1,938,736,0
即只有后面的重复值被删除,元素的顺序保持不变。
为此,我尝试创建向量“unsortedVec”中存在的一组唯一元素并继续迭代,如果这些元素已经存在于集合中,那么我没有将它们插入“unsortedVec”中。鉴于我的 unsortedVec 的大小,这变得非常缓慢。有什么方法可以从未排序的 vec 中删除重复元素。
我尝试了标记为重复问题的方法,但这也变得非常慢
【问题讨论】:
-
您的示例不保留剩余元素的位置(我理解:索引)。例如,736 现在位于索引 4(从 0 开始),而它最初位于索引 5。您的意思是“保留(取消)订单”吗?那有什么难的呢?
-
@PeterSchneider 感谢您的纠正,是的,我的意思是保持秩序。困难在于向量的大小,删除重复项变得非常慢
-
啊。好吧,这不是一个完整的答案,但是快速“删除”元素的典型其他地方是文件系统和内存分配器。他们倾向于将元素 标记 为“已删除”,这很快,而不是移动数据。在您的情况下,您将拥有一个带有值的结构加上一个指示“已删除”的布尔值,并将其放在一个向量中;或者您将使用两个向量,一个具有填充后从未触及的值,第二个是 bool 指示第一个的哪些元素被删除。