Предположим, что e
наборов в X
такое, что сумма размеров всех e
наборов равна n
, т. Е. |S1| + |S2| + ... + |Se| = n
, тогда в худшем случае X.find(V)
примет O(m*log(e))
, где m
- это размер V
, т. Е. |V| = m
. Как видите, он не зависит от n
.
Почему? Таким образом, set
в STL обычно реализуется как самобалансирующееся двоичное дерево поиска. Поэтому высота root всегда равна O(log(e))
, где e
- это общее количество элементов в дереве на данный момент. Теперь обратите внимание, что в нашем случае узлы дерева являются множествами. set
по умолчанию использует оператор меньше чем <
для сравнения с другими set
того же типа, что занимает O(min(|S1|, |S2|))
время для сравнения.
Поэтому в худшем случае, если установлено V
мы хотим найти это один из листьев X
, и все узлы на ветке от root до V
имеют размер >= |V|
, тогда сравнение каждого узла займет O(|V|)
времени, а поскольку O(log(e))
узлы в этой ветке, это займет у нас O(m*log(e))
времени.