Какова временная сложность доступа к элементу в `map`?

Ответ

Временная сложность основных операций (добавление, получение, удаление) в map в Go имеет следующие характеристики:


  • В среднем случае: O(1) (амортизированное константное время).

    Это достигается за счёт использования хеш-таблицы. Ключ хешируется, и по значению хеша определяется «корзина» (bucket), где хранится значение. Это очень быстрая операция.



  • В худшем случае: O(n) (линейное время).

    Худший случай возникает при большом количестве коллизий, когда множество разных ключей дают одинаковый хеш. В такой ситуации все эти элементы попадают в одну «корзину» и для поиска нужного ключа приходится перебирать их последовательно, как в связанном списке. На практике, благодаря качественным хеш-функциям в Go, такая ситуация крайне маловероятна.


Пример операций:

m := make(map[string]int)

m["key1"] = 10 // Добавление, в среднем O(1)

value := m["key1"] // Получение, в среднем O(1)

delete(m, "key1") // Удаление, в среднем O(1)

Также стоит помнить, что при росте map может происходить рехеширование (перестройка всей таблицы), что является временной операцией O(n), но её стоимость «размазывается» по всем операциям вставки, приводя к амортизированной сложности O(1).