将字符串转换为等效号码的复杂性是什么,反之亦然?它会根据编程语言而改变吗?

从表面上看,一个人需要穿越整个字符串才能将其转换为一个数字,所以它是 上), ,还是使用一些打字?

当我编写例程以检查给定的数字是否是alendindrome时,这一疑问就产生了。一种方法是将数字除以基数(这里10),积累数字,然后将它们放在末尾。示例:309/10 = REM(9),30/10 = REM(0),3/10 = REM(3)。我们得到903。

我采用的另一种方法是将此数字转换为字符串,并且由于字符串具有大量的成员函数以拆分,反向等,因此代码要短得多,但这是最好的方法吗?

有帮助吗?

解决方案

数字字符串以位置符号为格式的数字 - 因此,需要考虑将每个数字的值乘以基本的功率,以便将数字转换为二进制格式。

是的,这是一个O(n)操作,因为随着添加更多数字,运行时间会线性增加。但是,在实践中,N可能会受到语言支持的数字数据类型的限制(例如INT32_T,INT64_T)。但是,如果使用任意精度数字类型(默认情况下使用Python,例如Python,则使用这些语言),则数字数量没有限制(显然可用的内存除外)。

其他提示

要转换为一个数字,您始终必须读取所有数字。所以至少是 O(n).

现在做(伪代码)之类的事情

a = 0
foreach digit in string
do
   a = 10 * a + digit
end

O(n). 。所以复杂性是 O(n)

如果您将数字n转换为字符串。它需要O(log(n))带有基础10。(如果您除以10并保留剩余的),如果要转换为长度为n的字符串,则需要O(n)。 (如果您使用算法,请不断添加您的编号10^(n)*数字(n))

如果您使用非您的功能(假设字符串),则只能期望它们会变慢。

我可以肯定的是,与纯数字运算符打交道(在C ++和C#中,我认为这将是“%”模量运算符)如果正确编码,因为在某些级别上,您必须检查类似的功能(确实可以正确编码(确实有)最终匹配开始)并在字符串和数字之间执行转换,只有在不执行该转换的情况下可以执行相同的事情,才能增加操作的复杂性。

也就是说,我不必担心数字和字符串之间转换的性能影响,因为与程序的大多数其他领域的性能相比,它可能微不足道。数字类型限制为64位,除非您正在实现/使用自定义编码的大数字类型,否则您可以计划解析的数字数量相对较低。

您不必担心n是数字的幅度的复杂性是o(n)。它更像是o(n),其中n是数字的数量(我提到的低帽子)或(如另一个回复中所述)o(log(log(log(log(log(log(log(log(log(log(log(log(log(lig(lig))在')))))))))))))都因为语都因为有久有)进行)))))))发生)进行)))))有因为具))))))))具))))举)))))))有很大作用。相对微不足道的性能影响。

现在,如您所建议的那样,您对N没有限制(这是不可能的(因为使用2 GB的RAM,您只能存储多达20亿位数字的数字),那么我们可能不得不更多地考虑执行数学的性能操作员。考虑在此大型类型上的“%”和“/”操作员的性能。但是,然后意识到,为了将数字转换为字符串,它基本上是使用相同的操作员。再一次,如果正确执行,您将无法直接击败它作为数字。

C#和C/C ++在字符串中没有任何特殊信息,代表(可能的)数值。因此,他们需要在转换时通过数字来解析字符串数字。

但是,数字的数量有限,因此我们只有O(1):转换时间是有限的(通常是由最大数字的转换)。对于32位INT,转换必须最多考虑10个小数位数(可能是符号)。

从字符串的转换实际上也是O(1),因为在解析过程中,仅考虑有界数的字符(在32位INT的情况下为10+1)就足够了。

严格来说,我们不能使用 O- 对于int到弦转换的情况,由于int的最大值是有界的,因此对int到弦转换的情况进行了说明。无论如何,转换所需的时间(在两个方向上)受常数的限制。

正如@Charles所建议的那样,其他语言(Python)实际上可以使用任意推荐数字。对于解析这样的数字,时间是 O(number of digits), , 哪个 O(string length)O(log(number)) 对于两个转换。使用任意推荐的数字,一个人不能更快地做到这一点,因为对于这两个转换,都必须考虑每个数字。对于限量计数的转换,相同 O(1) 推理适用。但是,我本人并未介绍Python中的解析,因此可能在那里使用了效率较低的算法。


编辑:遵循@steve建议,我检查了在C/C ++中解析的,C#跳过初始的Whitespace,因此String-> int转换的时间是 O(input length). 。如果知道字符串已修剪,则转换又是 O(1).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top