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()的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章