【问题标题】:Time complexity of bin() in PythonPython中bin()的时间复杂度
【发布时间】:2018-11-20 10:44:47
【问题描述】:

bin(n) 在 Python 中的时间复杂度是多少,其中n 是十进制数(整数)?

例如:

如果是n = 10,然后是bin(n) = 0b1010,那么幕后发生了什么?十进制转二进制需要多少时间? Big O 这个符号是什么?

【问题讨论】:

    标签: python python-3.x binary time-complexity big-o


    【解决方案1】:

    python中bin(n)的时间复杂度是多少,其中n是十进制数(整数)?

    十进制转二进制需要多少时间?

    数字n 没有从十进制到二进制的转换,因为内部表示已经是二进制。整数值表示为64-bit 值的数组(例如,如果该值小于2^64 - 1,则该数组包含一个元素)。因此,要以二进制形式显示,需要从最高位到最低位打印出来。

    如果您查看bin() 或更具体的宏#define WRITE_DIGITS(p) link here 的源代码,您将看到以下循环:

    for (i = 0; i < size_a; ++i) {
        ...
    }
    

    size_a 表示必须找到二进制表示的数字 a(64 位整数数组的大小)的大小。

    然后,在for 循环中有一个while,其中来自i 的位a 的第一个数字被提取并保存到字符串表示p 中:

    ...
    do {
        ...
        cdigit = (char)(accum & (base - 1));
        cdigit += (cdigit < 10) ? '0': 'a' - 10;
        *--p = cdigit;
        ...
    } while (...);
    ...
    

    执行内部循环,直到提取当前数字的所有位。在此之后,外部循环移动到下一个数字,因此所有位都会再次从内部循环中提取。以此类推。

    但迭代次数等于给定数字n 的二进制表示中的位数,即log(n)。因此,bin() 对数字 n 的时间复杂度是 O(log(n))

    【讨论】:

    • 由于 n 的最大长度为 63,将其描述为 O(m) 是否有意义?
    • @Learning stats by example 在Python 3中,整数的最大长度不是63。它是无限的,因为整数表示为 64 位整数数组。因此,O(log(n)) 是有效的。
    • 你确定吗?我认为如果它超过 64 位,它只是一个 bigint。如果这是真的,所有的按位运算都是 o(n)。
    • @Learningstatsbyexample The sys.maxint constant was removed, since there is no longer a limit to the value of integers - 你可以在这里找到链接 - docs.python.org/3.1/whatsnew/3.0.html#integers
    【解决方案2】:

    是log(n)。想想简单的除法,我们把这个数除以 2,直到余数变成 0 或 1,就像树遍历一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2016-08-20
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多