哪个数据结构在追加Duplicate时提供了Replace操作

Which Data Structure provides Replace Operation when appending Duplicate?

本文关键字:Replace 操作 Duplicate 数据结构 追加      更新时间:2023-10-16

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

这可以通过堆来实现吗?

谢谢!

std::set就是这样做的。事实上,如果你不想发生这种情况,你需要切换到multiset。

来自设置的文档

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

不,我认为堆对解决这个问题没有帮助。

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

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

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

关于性能:

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