【发布时间】:2011-11-11 03:46:59
【问题描述】:
log base 10函数的复杂度是多少?
【问题讨论】:
-
这不取决于所使用的算法吗?例如,查找表是 O(1)。
标签: algorithm math language-agnostic complexity-theory logarithm
log base 10函数的复杂度是多少?
【问题讨论】:
标签: algorithm math language-agnostic complexity-theory logarithm
在O(1) 中做log(n)(其中n 是整数)
int log(long long x)
{
return 64 - __builtin_clzl(x) - 1;
}
__builtin_clzl(x) 参考here
【讨论】:
这实际上取决于您要计算对数的值的域。
对于 IEEE 双精度数,许多处理器可以在一条汇编指令中取对数;例如,x86 具有 FYL2X 和 FYL2XP1 指令。虽然通常像这样的指令只会取某个固定底数的对数,但它们可以用来取任意底数的对数,因为
loga b = logc b / logc a
只需取两个对数并求商。
对于一般整数(任意精度),您可以使用重复平方与二分搜索相结合,仅使用 O(log log n) 算术运算来取对数(每次平方数字时,您将指数翻倍,这意味着您在超过它的值之前只能将数字 log log 平方 n 次,并且可以进行二进制搜索)。使用some cute tricks with Fibonacci numbers,您只能在 O(log n) 空间中执行此操作。如果您正在计算 binary logarithm,您可以使用一些可爱的技巧与位移一起在更短的时间内计算该值(尽管渐近复杂度是相同的)。
对于任意实数,逻辑更难。您可以使用牛顿法或泰勒级数来计算一定精度内的对数,但我承认我不熟悉执行此操作的方法。但是,您实际上很少需要这样做,因为大多数实数都是 IEEE 双精度数,并且在这种情况下有更好的算法(甚至是硬件指令)。
希望这会有所帮助!
【讨论】:
CTZ(x & (x - 1)) 或wordsize - LZC(x)) - 但 AFAIK 根本无助于时间复杂度(只是实际速度)