【发布时间】: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
bin(n) 在 Python 中的时间复杂度是多少,其中n 是十进制数(整数)?
例如:
如果是n = 10,然后是bin(n) = 0b1010,那么幕后发生了什么?十进制转二进制需要多少时间? Big O 这个符号是什么?
【问题讨论】:
标签: python python-3.x binary time-complexity big-o
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))
【讨论】:
63。它是无限的,因为整数表示为 64 位整数数组。因此,O(log(n)) 是有效的。
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
是log(n)。想想简单的除法,我们把这个数除以 2,直到余数变成 0 或 1,就像树遍历一样。
【讨论】: