log函数的复杂度是多少?
Posted
技术标签:
【中文标题】log函数的复杂度是多少?【英文标题】:What is the complexity of the log function? 【发布时间】:2011-11-11 03:46:59 【问题描述】:log base 10函数的复杂度是多少?
【问题讨论】:
这不取决于所使用的算法吗?例如,查找表是 O(1)。 【参考方案1】:在O(1)
中做log(n)
(其中n 是整数)
int log(long long x)
return 64 - __builtin_clzl(x) - 1;
__builtin_clzl(x)
参考here
【讨论】:
这将计算数字的二进制对数,假设数字是整数。但如果你想计算以 10 为底的对数,我认为你需要使用不同的策略。 这段代码实际上是在 2 的基础上返回 log。 @iamakshatjain,您可以更新代码,使其适用于用户指定的任何基值。【参考方案2】:这实际上取决于您要计算对数的值的域。
对于 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 根本无助于时间复杂度(只是实际速度)
@templatetypedef 您可以将其乘以一个常数因子以获得任何其他基数的对数,正如您刚才演示的那样。 :)
@NickJohnson 是的,并且认为它确实很快,我们应该注意,乘法运算本身具有更高的对数复杂度:en.wikipedia.org/wiki/…以上是关于log函数的复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章