这种算法的复杂性如何对数?

时间:2014-07-17 19:18:23

标签: algorithm time time-complexity logarithm

以下是代码:

def intToStr(i):
 digits = '0123456789'
 if i == 0:
   return '0'
 result = ''
 while i > 0:
   result = digits[i%10] + result
   i = i/10
 return result

我理解,对数复杂度,每次迭代时,基本上将必要的步骤除以某个值(例如二进制搜索算法)。但是在这个例子中,我们并没有真正地除以数字,而是一次删除一个字母。因此,通过在i中将i/10除以10,我们一次消除一个数字。我无法真正围绕这个算法...这个算法有名称,所以我可以更好地理解为什么这是对数的?

2 个答案:

答案 0 :(得分:4)

此算法的运行时间相对于输入的大小(位数)是线性的,因此根据通常的定义,它不是对数的。但是,运行时间相对于输入的数值是对数的,因此它可以称为“伪对数”。

另见:Pseudo-polynomial time

答案 1 :(得分:2)

让我们看一下123的步骤:

i     result
123   ""
12    "3"     -- after first iteration
1     "23"    -- second iteration
0     "123"   -- third iteration

对于数字123,我们需要3个步骤将其转换为字符串。通过进一步测试,我们基本上看到迭代次数总是等于我们想要转换的数字的位数。因此,对于任何n,我们可以说该算法需要floor(log10(n)+1)个步骤,等于Big O表示法中的log(n)

编辑:

哈马尔的答案在复杂性的细节上提供了更多的信息(可以说他在头上钉了一针(双关语意))所以如果你想要确切地知道复杂性并希望能够引用它正确的你应该看看他的答案,否则我认为这种“伪对数”满足了你的需求。