Python的int.bit_length()最坏情况下的时间复杂度

时间:2019-10-19 08:50:23

标签: python time-complexity

当我们调用函数int.bit_length并传递一个整数n时, 是最坏情况下的时间复杂度O(log(n))还是Python使用了一些技巧来改进它(例如,在创建n的最高有效位的位置时将其存储)?

1 个答案:

答案 0 :(得分:2)

In CPython,对于内部表示位数少于PY_SSIZE_T_MAX/PyLong_SHIFT(即少于PY_SSIZE_T_MAX个二进制位数)的值,它是根据内部位数计算的,是的:

msd = ((PyLongObject *)self)->ob_digit[ndigits-1];
msd_bits = bits_in_digit(msd);

if (ndigits <= PY_SSIZE_T_MAX/PyLong_SHIFT)
    return PyLong_FromSsize_t((ndigits-1)*PyLong_SHIFT + msd_bits);

否则,对于O(log log N)的整体时间复杂性,它又要经过bigints的处理(这在实践和理论的奇怪混合中也不是完全正确的,所以……)。

/* expression above may overflow; use Python integers instead */
result = (PyLongObject *)PyLong_FromSsize_t(ndigits - 1);
if (result == NULL)
    return NULL;
x = (PyLongObject *)PyLong_FromLong(PyLong_SHIFT);
if (x == NULL)
    goto error;
y = (PyLongObject *)long_mul(result, x);
Py_DECREF(x);
if (y == NULL)
    goto error;
Py_DECREF(result);
result = y;

x = (PyLongObject *)PyLong_FromLong((long)msd_bits);
if (x == NULL)
    goto error;
y = (PyLongObject *)long_add(result, x);
Py_DECREF(x);
if (y == NULL)
    goto error;
Py_DECREF(result);
result = y;

return (PyObject *)result;

tl; dr:是O(1)