Существует противоречие относительно того, является ли операция вставки в dict () или операция добавления в set () O (n) или O (1), где n - длина строки.
Предположим, у нас есть строки различной длины, т.е. n1, n2, ... n_x.Тогда временная сложность выполнения следующего:
s = set()
d = dict()
for x in {N}: # where N = [n1, n2, ... n_x]
s.add(x)
d[x] = 1
равна O(len(N) * Z)
, где Z = len(n_1) + len(n_2) + ... len(n_x)
Если мы предположим, что операция добавления или вставки является O (1), тогда сложность времени будет O (len (N))).
Верно ли указанное выше?
С: http://svn.python.org/projects/python/trunk/Objects/stringobject.c мы видим, что вычисление хеша зависит от длины строки, что, как я предполагаю, приведено ниже:
static long string_hash(PyStringObject *a)
{
register Py_ssize_t len;
register unsigned char *p;
register long x;
if (a->ob_shash != -1)
return a->ob_shash;
len = Py_SIZE(a);
p = (unsigned char *) a->ob_sval;
x = *p << 7;
while (--len >= 0)
x = (1000003*x) ^ *p++;
x ^= Py_SIZE(a);
if (x == -1)
x = -2;
a->ob_shash = x;
return x;
}
Здесь ( эффективность длинных (str) ключей в словаре Python ) кто-то показал, что изменение длины строки не влияет на время вычисления хэша.Но это противоречит приведенному выше коду.
Из следующей ссылки мы знаем, что вычисленное значение хеша сохраняется в объекте.Это означает, что поиск будет постоянным временем O (1). Получить хэш ключей словаря без перерасчета