附加重复时哪个数据结构提供替换操作?

时间:2013-07-20 14:20:49

标签: c++ data-structures heap

是否有数据结构可以消除重复性低的复制品?附加新值时,如果已经存在相同的值,则不应添加该值。

这可以用堆来实现吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

std :: set就是这么做的。实际上,如果您希望不发生这种情况,则需要切换到多集合。

来自集合的documentation

  

因为集合中的元素是唯一的,所以插入操作会进行检查   每个插入的元素是否等同于已经存在的元素   容器,如果是,则不插入元素,返回一个   此现有元素的迭代器(如果函数返回值)。

答案 1 :(得分:1)

不,我不认为堆有助于解决这个问题。

可能最快的方法是使用哈希表。它们在C ++ 11或Boost中以unordered_set(unordered_multiset允许重复)提供。

第二种方法可能是使用二进制搜索树,如C ++ 98标准std :: set(同样,multiset允许重复),这通常由红黑树实现。

第三种但有限的选择是首先对元素进行排序,然后删除现在连续的重复项。这只有在您首先添加所有元素并且之后的所有查找都可用时才可行。否则,您只能使用前两个选项。 C ++为您提供了使用此方法的std :: sort和std :: unique。

关于绩效:

  • 哈希表:每次访问O(1),假设你有一个好的哈希函数。
  • 平衡二叉搜索树:最坏情况下每次访问O(log n)。
  • 排序+删除重复:对于所有n个元素O(n * log n),但可能具有比二叉树更低的常数因子。