为什么从向量构建一个集合是 O(N)
why building a set from vector is O(N)
众所周知,set 是使用红黑树实现的,因此插入一个元素将是 O(log N) 复杂度的任务。但是,如果给定一个包含 n 个不同整数的向量,那么应该通过 NlogN 任务从中创建一个集合。但是在很多地方,我发现它是作为 O(N) 给出的。有人可以帮我解决这个问题吗?提前致谢。
Link 到我读这篇文章的地方
Complexity of building a set from list?
如果向量已经排序,那么构造set
确实是O(N)
(但一般不是!)。
来自cppreference:
template< class InputIt >
set( InputIt first, InputIt last,
const Compare& comp = Compare(),
const Allocator& alloc = Allocator() );
Range constructor. Constructs the container with the contents of the range [first, last). If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted
Complexity
N log(N) where N = std::distance(first, last) in general, linear in N if the range is already sorted by value_comp().
标准中的相关引用是:
22.4.6.2#4 Complexity: Linear in N if the range [first, last) is already sorted using comp and otherwise NlogN, where N is last - first.
该标准仅规定了容器的作用,而不是它们如何完成的。使用红黑树是典型的,但不是实现 std::set
.
所必需的
众所周知,set 是使用红黑树实现的,因此插入一个元素将是 O(log N) 复杂度的任务。但是,如果给定一个包含 n 个不同整数的向量,那么应该通过 NlogN 任务从中创建一个集合。但是在很多地方,我发现它是作为 O(N) 给出的。有人可以帮我解决这个问题吗?提前致谢。
Link 到我读这篇文章的地方 Complexity of building a set from list?
如果向量已经排序,那么构造set
确实是O(N)
(但一般不是!)。
来自cppreference:
template< class InputIt >
set( InputIt first, InputIt last,
const Compare& comp = Compare(),
const Allocator& alloc = Allocator() );
Range constructor. Constructs the container with the contents of the range [first, last). If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted
Complexity
N log(N) where N = std::distance(first, last) in general, linear in N if the range is already sorted by value_comp().
标准中的相关引用是:
22.4.6.2#4 Complexity: Linear in N if the range [first, last) is already sorted using comp and otherwise NlogN, where N is last - first.
该标准仅规定了容器的作用,而不是它们如何完成的。使用红黑树是典型的,但不是实现 std::set
.