Большое O для вставки в коллекцию

74
12 ноября 2019, 19:10

Как посчитать большое О для вставки в коллекцию?

Коллекция имеет вид:

typedef std::map<std::string, tokens> Consumers;  
typedef std::unordered_set<std::string> Tokens;

Каким образом оно расчитывается? Произведение сложности вставки в unordered_set и сложности вставки в map, или иным образом?

Answer 1

Для того, чтобы правильно посчитать сложность вставки, выборки или поиска рандомного элемента в контейнере в первую очередь нужно понимать как этот контейнер сохраняется в памяти. Или это участок память без разрывов, или это связной список или дерево или хештейбл и т.п. Понимая это ,понять эффективность контейнеров станет намного проще, а с таким подходом "просто заучить" это не даст никакого понимая. Для std::map и std::unordered_map ну нужно самостоятельно ничего считать, можно посмотреть их эффективность по всем операциям здесь.

Answer 2

Зависит от порядка.

Если вставляем по m строк в n unordered_set, имеем O(mn)+O(log n), т.е. вообще говоря O(mn).

Если вставляем n пустых unordered_set в map, а потом случайным образом (с поиском в map!) заполняем их m строками каждый, то O(log n)+O(m*n*log n), т.е. O(mn*log n).

И не забываем, что unordered_set имеет O(1) в среднем, но может иметь при невезении и O(n)...

"По-моему, так" (с) Пух

Answer 3

Исходя из определения

фраза «сложность алгоритма есть O(f(n))» означает, что с увеличением параметра n, характеризующего количество входной информации алгоритма, время работы алгоритма будет возрастать не быстрее, чем некоторая константа, умноженная на f(n);

вы можете сами посчитать "большое О" проведя эксперимент (например вставка 100_000 элементов), и подобрав аппроксимационную функцию.

Answer 4

Смотря что собираешься вставлять, если пару std::string и Tokens то будет сложность map( O(logn)), тк он по sting`е просто положит unordered_set. Если же достать по std::string unordered_set и вставить уже в него, тогда будет сумма сложностей. Так как сначала ищем нужный unordered_set O(logN) а потом вставляем в него O(1).

READ ALSO
Почему имена в шаблонах необязательны?

Почему имена в шаблонах необязательны?

Смотрю описание шаблонов и заметил, что имена параметров везде помечены как необязательные, но ведь если имя отсутствует, то параметр внутри...

82
Сравнение двух строк, одна с пробелом

Сравнение двух строк, одна с пробелом

У меня есть функция поиска, но при сравнивании строки с помощью этой функции, strcmp(mas[ii]street,pt), и тут возникла проблема, строка которую ввожу,...

113
Адаптивность на форме Qt Creator

Адаптивность на форме Qt Creator

Такой вопрос, я добавляю динамически на форму следующие компоненты:

122
strict aliasing и char*

strict aliasing и char*

Пытаюсь понять, в какой мере strict aliasing rule не касается char

111