Когда вы выполняете анализ Big-O, вам нужно очень четко понимать, что это за переменные. Часто n оставляют неопределенным или подразумеваемым, но важно знать, что именно.
- Давайте определим n как количество элементов в хэш-карте.
Когда n является единственной рассматриваемой переменной, тогда все методы являются O (1). Ни один из них не зацикливается на this.list
, и поэтому все они работают в постоянное время относительно количества элементов в хэш-карте .
Но вы возражаете: в hash()
есть петля. Как это может быть O (1). Ну, что это зацикливается? Зацикливается ли оно на других объектах на карте? Нет. Это зацикливание на input
- но input.length
- не та переменная, которую мы рассматриваем.
Когда люди анализируют производительность хеш-карты, они обычно игнорируют длину передаваемых строк. Если мы сделаем это, тогда относительно n производительности хеш-карты составит O (1) * +1032 *. * * 1 033
Если вам важны длины строк, вам нужно добавить еще одну переменную в анализ.
- Давайте определим n как количество элементов в хэш-карте.
- Давайте определим k как длину читаемой / записываемой строки.
Хеш-функция равна O ( k ), поскольку она циклически перебирает входную строку за линейное время. Следовательно, get()
и set()
также O ( k ).
Почему нас не волнует k нормально? Почему люди говорят только о n ? Это потому, что k является фактором при анализе производительности хеш-функции, но когда мы анализируем, насколько хорошо работает хеш-карта, нам не особо важно, насколько быстро работает хеш-функция. Мы хотим знать, насколько хорошо работает сама хэш-карта, и на k не влияет ни один из ее кодов. Только hash()
есть, а hash()
не является частью хэш-карты, это всего лишь вход в нее.