【发布时间】:2014-04-04 07:13:05
【问题描述】:
我试图弄清楚从 std::set 中擦除多个元素的复杂性。我使用this page 作为来源。
它声称使用迭代器擦除单个项目的复杂度摊销为 O(1),但使用范围形式擦除多个项目是 log(c.size()) + std::distance(first, last) (即 - 集合大小的日志 + 删除的元素数)。
从表面上看,如果要擦除的元素数(n)远小于集合中的元素数(m),这意味着循环遍历要擦除的元素并以一个时间比一次调用擦除它们要快(O(n))(O(log m)假设n
显然,如果真的是这样的话,第二种形式的内部实现只会执行上述循环。
这是网站的错误吗?规格中的错误?我只是错过了什么吗?
谢谢, 沙查尔
【问题讨论】:
-
使用范围形式擦除多个项目是 log(c.size()) + std::distance(first, last) (即 - 集合大小的对数 + 元素数已删除)。 - 固定集的大小与 O(n) 完全一样,其中 n 是删除的元素数,这是您从一个一个删除它们中得到的。
-
这很有趣,我想您可以通过两种方式测试它以查看差异。在每次单独擦除后重置迭代器可能会有一些开销(因为我认为这会使迭代器无效)
-
@Cthulhu,只要在复杂性中使用加号,同样的逻辑也适用。任何你假设为常数(甚至是有界)的东西都会自动具有 O(1) 的复杂度。
标签: c++ stl time-complexity stdset