Python中bin()的时间复杂度

Posted

技术标签:

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

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

例如:

如果是n = 10,然后是bin(n) = 0b1010,那么幕后发生了什么?十进制转二进制需要多少时间? 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,就像树遍历一样。

【讨论】:

以上是关于Python中bin()的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

Python 中 zip() 的时间复杂度是多少?

检查python中两个元组是不是相等的时间复杂度

python基础结构的时间复杂度

Python内置方法的时间复杂度

Python语言算法的时间复杂度和空间复杂度

Python中嵌套For循环的时间复杂度