【问题标题】:Long numbers hashing complexity in PythonPython中的长数字散列复杂度
【发布时间】:2015-01-28 10:55:59
【问题描述】:

Python 如何散列长数字?我猜 32 位整数需要 O(1) 时间,但是长整数在 Python 中的工作方式让我认为复杂性对它们来说不是 O(1)。我一直在寻找相关问题的答案,但没有一个足够直截了当让我自信。先感谢您。

【问题讨论】:

    标签: python hash time-complexity


    【解决方案1】:

    long_hash() function 确实循环并且取决于整数的大小,是的:

    /* The following loop produces a C unsigned long x such that x is
       congruent to the absolute value of v modulo ULONG_MAX.  The
       resulting x is nonzero if and only if v is. */
    while (--i >= 0) {
        /* Force a native long #-bits (32 or 64) circular shift */
        x = (x >> (8*SIZEOF_LONG-PyLong_SHIFT)) | (x << PyLong_SHIFT);
        x += v->ob_digit[i];
        /* If the addition above overflowed we compensate by
           incrementing.  This preserves the value modulo
           ULONG_MAX. */
        if (x < v->ob_digit[i])
            x++;
    }
    

    其中i 是“对象大小”,例如用于表示数字的位数,其中位数的大小取决于您的平台。

    【讨论】:

    • 据我所知,在 Python 3 中所有数字都是长类型的,所以可以肯定地说在 Python 3 中对数字进行哈希处理总是 O(i) 吗?
    • @GrayFall9:是的,是的。 Python 3 int 就是 Python 2 所称的 long。请注意,数字大小通常为 15 或 30 位,因此即使对于大数字,迭代次数也非常少。您需要超过 1152921504606846976 的数字才能在大多数现代系统上进行 3 次迭代。
    • @EliKorvigo:要明确时间复杂度是O(log(n)),其中n 是整数。对于小于可用内存的大整数,您可以使用gmpy2,以提高时间性能
    • @J.F.Sebastian 好吧,这很奇怪。我只是尝试在 Python 2 中散列一个随机的 500 位整数,它立即在我的机器上完成。
    • @EliKorvigo:那是因为math.log2(500) 刚好低于 9。您需要使用 far 更大的数字才能看到效果。是什么让您认为 O(logN) 意味着代码会在 N=500 时运行缓慢?
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2012-10-20
    • 2014-08-28
    • 1970-01-01
    • 2017-12-18
    • 2010-09-15
    • 2017-12-26
    • 2017-01-13
    相关资源
    最近更新 更多