是否有数据结构可以消除重复性低的复制品?附加新值时,如果已经存在相同的值,则不应添加该值。
这可以用堆来实现吗?
谢谢!
答案 0 :(得分:2)
std :: set就是这么做的。实际上,如果您希望不发生这种情况,则需要切换到多集合。
来自集合的documentation
因为集合中的元素是唯一的,所以插入操作会进行检查 每个插入的元素是否等同于已经存在的元素 容器,如果是,则不插入元素,返回一个 此现有元素的迭代器(如果函数返回值)。
答案 1 :(得分:1)
不,我不认为堆有助于解决这个问题。
可能最快的方法是使用哈希表。它们在C ++ 11或Boost中以unordered_set(unordered_multiset允许重复)提供。
第二种方法可能是使用二进制搜索树,如C ++ 98标准std :: set(同样,multiset允许重复),这通常由红黑树实现。
第三种但有限的选择是首先对元素进行排序,然后删除现在连续的重复项。这只有在您首先添加所有元素并且之后的所有查找都可用时才可行。否则,您只能使用前两个选项。 C ++为您提供了使用此方法的std :: sort和std :: unique。
关于绩效: