Ответ
В Dart сложность операции map[key] зависит от конкретной реализации Map:
| Реализация | Средняя сложность | Худший случай | Основа |
|---|---|---|---|
HashMap (по умолчанию) |
O(1) | O(n) | Хеш-таблица с разрешением коллизий методом цепочек. |
LinkedHashMap |
O(1) | O(n) | Хеш-таблица, сохраняющая порядок вставки. |
SplayTreeMap |
O(log n) | O(log n) | Сбалансированное дерево (splay tree). |
Пример и пояснение:
void main() {
// По умолчанию создаётся LinkedHashMap
Map<String, int> defaultMap = {'a': 1, 'b': 2};
print(defaultMap['a']); // ~O(1)
// Явное создание HashMap
Map<String, int> hashMap = HashMap();
hashMap['key'] = 100;
print(hashMap['key']); // ~O(1)
}
Почему в среднем O(1)?
HashMap и LinkedHashMap используют хеш-таблицу. При хорошей хеш-функции и достаточной ёмкости таблицы доступ к элементу происходит за константное время. В худшем случае (много коллизий) все элементы могут попасть в одну корзину, и поиск выродится в O(n).
Для Flutter-разработки:
- Для большинства сценариев (кэширование, группировка данных)
HashMap/LinkedHashMapс их O(1) доступом оптимальны. SplayTreeMapиспользуется, когда нужен автоматический порядок ключей или частый доступ к недавно использованным элементам.