我知道O(log n)
是指按问题集N
的固定比率进行迭代缩减(用大O表示法),但我如何实际计算它以查看算法的迭代次数log N
复杂度必须在问题集N
完成之前预先形成(剩下一个元素)吗?
答案 0 :(得分:3)
你不能。你不能用BigO来计算确切的迭代次数。
你可以"派生"当你有迭代次数的确切公式时,BigO。
BigO只是提供有关数量迭代如何随着N增长而增长的信息,并且仅针对" big" N.
没有更多,没有更少。有了这个,您可以得出结论,如果您有一些样本运行,算法将花费多少操作/时间。
答案 1 :(得分:1)
Tim Roughgarden在他的算法课程中的用语:
大哦符号试图为高级算法推理提供一个最佳点
这意味着它旨在描述算法时间执行与其输入大小之间的关系,避免依赖于系统架构,编程语言或所选编译器。
想象一下,大哦符号可以提供准确的执行时间,这意味着对于任何算法,你知道它的大时间复杂度函数,你可以预测它在任何机器上的表现如何。
另一方面,它以渐近行为为中心。也就是说,它的描述对于大n
值更准确(这就是为什么算法时间函数的低阶项在大写符号中被忽略的原因)。可以推断,低n
值不要求您推动尝试提高算法性能。
答案 2 :(得分:0)
Big O表示法仅显示一个数量级 - 而不是算法将执行的实际操作数。如果需要计算循环迭代或基本操作的确切数量,则必须手动完成。然而,在大多数实际目的中,确切的数字是无关紧要的 - O(log n)
告诉你num。通过加注n
答案 3 :(得分:0)
从大O符号中你无法确切地知道算法会进行多少次迭代,它只是估计。这意味着使用较小的数字,log(n)和实际迭代次数之间的差异可以显着区分,但是越接近无穷大,差异就越小。
答案 4 :(得分:0)
如果你做了一些假设,你可以估计一个恒定因子的时间。最大的假设是,随着大小趋于无穷大的限制行为与您关心的问题规模的实际行为相同。
根据该假设,对于某个常量N
,大小C*log(N)
问题的时间上限为C
。常量将根据用于计算对数的基数而变化。只要您对此基础保持一致,基数无关紧要。如果您有一个尺寸的测量时间,您可以估算C
并使用它来估计不同尺寸的时间。
例如,假设100号问题需要20秒。使用常用对数,C
为10.(100的常用日志为2)。这表明1000大小的问题可能需要大约30秒,因为1000的常见日志是3。
但是,这非常粗糙。该方法对于估计算法是否可用于大问题最有用。在这种情况下,您还必须注意内存大小。通常,设置问题的大小至少是线性的,因此其成本将比O(log N)
操作增长得快。