我需要一组整数,并且能够在恒定时间内删除一个值。我如何实现这一目标?
现在我正在使用std :: list,但它不是恒定的时间:
int myints[]= {17,89,7,14};
std::list<int> mylist (myints,myints+4);
mylist.remove(89);
答案 0 :(得分:3)
如果确实需要保证不断删除时间,那么如果在编译时已知大小,则可能需要使用std:bitset
。
如果在编译时未知大小,您可以考虑提升dynamic_bitset
或std::vector<bool>
。后者经常被批评,因为它不是一个容器,这可能是非常令人惊讶的,因为vector
实例化其他类型是一个容器。尽管如此,它似乎可以很好地完成手头的工作。
在任何情况下,对于其中任何一个,您在允许范围内的每个值都有一个位/布尔值。你&#34;插入&#34;通过将该索引处的位/布尔值设置为1 / true,以及&#34;删除&#34;通过将该索引处的bit / Boolean设置为0 / false来获取值。
对于上述所有内容,枚举当前集合中的元素(或甚至查找它包含的元素数量)对于集合可能存储的数字范围是线性的(而您当前的实现可以找到当前存储的项目数量)在具有常数复杂性的集合中,找到集合中的成员,其复杂性与其实际包含的项目数量呈线性关系。
如果您希望这组数字相对稀疏,并且可以使用通常大致不变的删除时间,即使它不能保证,那么您可能想要使用而是std::unordered_set
。
还有std::set
,它保证了删除的对数复杂性。这通常是O(log N),慢于std::unordered_set
(通常为O(1)),但最坏的情况也是O(log N),这比{{1}的最坏情况要好},在最坏的情况下是O(N)。
其中任何一项都可能比目前使用的unordered_set
显着提高速度。确切的差异会有所不同,但速度提升的完整数量级(对于这个特定的操作)根本不会令人惊讶(好吧,无论如何,我都不会感到惊讶)。