C# 和 C/C++ 在表示(可能的)数值的字符串中没有任何特殊信息。因此,他们需要在转换时逐位解析字符串。
但是,位数是有限的,所以我们只有 O(1):转换时间是有界的(通常是最大数字的转换)。对于 32 位 int,转换必须考虑最多 10 个十进制数字(可能还有一个符号)。
从字符串转换实际上也是 O(1),因为在解析它的过程中,只考虑有限数量的字符(在 32 位 int 的情况下为 10+1)就足够了。
严格来说,我们不能O
在 int 到字符串转换的情况下使用 -notation,因为 int 的最大值是有界的。无论如何,转换所需的时间(在两个方向上)都受到一个常数的限制。
正如@Charles 建议的那样,其他语言(Python)实际上可以使用任意精度的数字。对于解析这样的数字,时间分别是O(number of digits)
、 whichO(string length)
和O(log(number))
对于这两种转换。对于任意精度的数字,不能更快地做到这一点,因为对于这两种转换都必须考虑每个数字。对于有限精度数的转换,同样的O(1)
推理也适用。但是我自己并没有分析 Python 中的解析,所以可能在那里使用了效率较低的算法。
编辑:根据@Steve 的建议,我检查了 C/C++ 和 C# 中的解析是否跳过了初始空格,因此 string->int 转换的时间实际上是O(input length)
. 如果已知字符串已被修剪,则转换再次为O(1)
.