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函数的复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

该代码的时间复杂度是多少?

HZOJ Weed

算法复杂度中的O(logN)底数是多少

递归线性搜索的复杂性是多少(使用分而治之的技术)?

给定函数的复杂度是多少[重复]

函数的时间复杂度是多少?