有没有时间复杂度为O(lg * n)的算法(迭代对数函数)?

时间:2015-10-20 10:45:39

标签: algorithm time-complexity

在计算机科学中,n的迭代对数,写入log * n(通常为“log star”),是在结果小于或等于1之前必须迭代地应用对数函数的次数。最简单的形式定义是这种递归函数的结果:

是否存在时间复杂度为O(lg * n)的算法?

2 个答案:

答案 0 :(得分:3)

如果使用路径压缩实现union find algorithm并按等级实现联合,则union和find将具有复杂性O(log*(n))

答案 1 :(得分:0)

在算法的运行时分析中很少会看到log * n出现,但并非闻所未闻。这是几种可能导致log * n出现的情况。

方法1:缩小对数因子

许多分治算法通过将大小为n的输入转换为大小为n / k的输入来工作。这些算法的阶段数为O(log n),因为在将输入缩减为恒定大小之前,您只能除以恒定的O(log n)次。从这个意义上讲,当您看到“输入除以常数”时,您应该想到“因此我们只能用O(log n)次对它进行除法,然后再进行除数运算。”

在极少数情况下,某些算法通过将输入大小缩小对数因子来工作。例如,range semigroup query problem的一种数据结构是将一个较大的问题分解为大小为log n的块,然后将每个大小为log n的块递归细分为大小为log log n的块,依此类推。此过程最终停止一旦块达到某个较小的恒定大小,这意味着它在O(log * n)迭代后停止。 (然后可以改进此特定方法,以提供一种数据结构,其中块的整数对数为O(log ** n),大小为log * n,最终收敛到运行时为O(α(n )),其中α(n)是逆阿克曼函数。

方法2:压缩数字位数

以上部分讨论了将显式问题分解为较小部分的方法,这些问题的大小与原始问题的大小成对数。但是,还有另一种方法来接收大小为n的输入并将其减小为大小为O(log n)的输入:用大小近似于其位数的输入替换输入。由于写出数字n要求写出O(log n)个数字,因此具有将数字的大小缩小以获得O(log * n)项所需的数量的作用。

作为一个简单的例子,考虑一种算法来计算数字的digital root。这是通过反复将数字的位数加起来直到达到位数而得到的数字。例如,可以通过计算找到78979871的数字根

7 + 8 + 9 + 7 + 9 + 8 + 7 + 1 = 56

5 + 6 = 11

1 +1 = 2

2

并获得2的数字根。每次我们将数字的位数相加时,我们将数字n替换为最多9个log10n⌉的数字,因此回合数为O(log * n)。 (也就是说,总运行时间为O(log n),因为我们必须考虑与将数字的位数相加相关的工作,而将原始数字的位数相加会主导运行期。)

对于一个更详细的示例,"Parallel Symmetry-Breaking in Sparse Graphs" by Goldberg et al中描述了一种并行算法,用于对树的节点进行三色着色。该算法的工作原理是,通过用数字的某些位求和形成的更简单的数字来重复替换数字,并且像上述方法一样,所需的回合数为O(log * n)。

希望这会有所帮助!