set<int> s;
s.insert(1);
s.insert(2);
...
s.insert(n);
Интересно, сколько времени уходит на s.find(k)
, где k
число от 1..n? Я предполагаю, что это журнал (n). Это правильно?
set<int> s;
s.insert(1);
s.insert(2);
...
s.insert(n);
Интересно, сколько времени уходит на s.find(k)
, где k
число от 1..n? Я предполагаю, что это журнал (n). Это правильно?
O(log N) для поиска отдельного элемента.
§23.1.2 Таблица 69
expression return note complexity
a.find(k) iterator; returns an iterator pointing to an logarithmic
const_iterator element with the key equivalent to k,
for constant a or a.end() if such an element is not
found
Сложность того, что std::set::find()
является O(log(n))
, просто означает, что будет порядка log(n)
сравнений объектов, хранящихся в set
.
Если сложность сравнения двух элементов в наборе равна O(k)
, то фактическая сложность будет O(log(n)∗k)
.
это может произойти, например, в случае набора строк (k будет длиной самой длинной строки) как сравнение двух строк может подразумевать сравнение большей части (или всех) их символов (если они начинаются с одного и того же префикса или равны)
В документации говорится то же самое:
Сложность
Logarithmic in size.