如何使用Math.pow或Math.log描述方法的Big O表示法?

时间:2015-12-13 01:17:01

标签: c# big-o time-complexity

假设我的方法有pow / log的变量和常量:

double LogX(int x){
   return Math.Log(x, constantBase);
}

double PowX(int x){
   return Math.Pow(constant, x);
}

在使用Math函数时,我不确定这些是正确的时间复杂度。我的概念印象是PowX将是O(n),因为它必须将常数乘以n-1次,但我知道还有其他方法来实现幂函数,并且无法找到关于我应该在那里假设的明确答案。如果它是恒定时间,那么它是O(n)吗?我同样不确定如何正确处理LogX。

如果重要的话,我正在使用C#,但我正在寻找对此的一般理解。如果我只有一个方程式f =常数^ x或f = log(x),那么我对这些时间复杂度的答案是不是比通过数学函数做的那样?

1 个答案:

答案 0 :(得分:1)

对于位数有限的数字(例如float / double / int),您可以考虑这些函数(以及其他类似函数sin / {{ 1}})作为O(1),因为当它们由浮点处理器执行时,它们有明确定义的界限,即使手动实现,用于计算函数的系列也可以用固定数量的元素来限制。

对于任意长数字,您必须使用明显更复杂的估算值,这些估算值也必须直接与您的实施相关联。

即。像cos(其中n是整数)这样的整个幂可以在O(log n)乘法(sample)中计算,复杂度的每个乘法依次取决于每个数字中的位数(对于单个乘法O(initial_length_in_bits ^ 2),对于所有乘法I' d guess ^ 3)。因此产生的复杂性将类似于O(log n * initial_length_in_bits ^ 3)。