如果我有一个算法需要 n log n 步骤(例如 heapsort),其中步骤需要 log n 时间(例如比较/交换 0 到 n-1 范围内的“大”整数),那么整个过程。
显然我们可以说“n (log n) (log n)”,但我很难说服自己我不能将其简化为“n log n”。与此同时,我很难证明坚持认为我可以做到的本能。
我的直觉是完全错误的吗?
编辑
似乎我的简单示例避免使问题复杂化使问题复杂化。那好吧。
这个问题的真正原因是我经常有一个已知复杂度的标准算法,但使用不同的底层容器实现,因此各个步骤是 O(log n) 而不是 O(1)。例如,Hopcrofts 自动机最小化算法是 O(n log n) - 但是如果您开始使用二叉树容器来存储状态、转换和中间结果,那么步骤本身就会变成 O(log n) - O(n log n) 是不再有效,因为 O(1) 访问的假设是无效的。
尽管如此,人们仍会声称存在 n 个状态和 m 个转换,但是对于自动机,n 和 m 往往是线性相关的,假设转换注释的数量是恒定的并且自动机或多或少是确定性的。
过去我并没有太担心这一点——我处理的案例并不是很大。但是,好吧,我正在对我的自动机代码进行重大重构,我想我不妨在我进行时对一些关键算法进行正确的数学运算。
编辑
我也越来越相信“n (log n) (log n)”是错误的。
如果 a 是 O(b log b),而 b 是 O(log c),那么 a 与 c 的关系是多少?