【问题标题】:Deleted duplicate elements from large unsorted vector while retaining their order [duplicate]从大型未排序向量中删除重复元素,同时保留它们的顺序[重复]
【发布时间】: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 指示第一个的哪些元素被删除。

标签: c++ vector


【解决方案1】:

当你从向量中删除元素时,它后面的所有元素都应该被移动。创建另一个向量,根据第一个向量的大小在其中保留空间,然后从第一个向量中复制所有唯一元素会更快(您检查唯一性的方法很好,只需使用 unordered_set 而不是 set)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多