如何用大 O 表示法计算 O(log n)?

How to calculate O(log n) in big O notation?

我知道O(log n)指的是问题集N的固定比例的迭代减少(大O表示法),但我实际上如何计算它以查看迭代次数具有 log N 复杂度的算法在完成之前必须对问题集 N 执行(还剩一个元素)?

大 O 符号仅显示数量级 - 而不是算法将执行的实际操作数。如果您需要计算循环迭代或基本操作的确切数量,则必须手动完成。然而,在大多数实际用途中,确切的数字是无关紧要的——O(log n) 告诉你那个数字。操作将以对数方式增加 n

根据大 O 表示法,您无法准确判断算法将进行多少次迭代,这只是估计。这意味着对于较小的数字,log(n) 和实际迭代次数之间的差异可能会有显着差异,但越接近无穷大,差异就越小。

你不能。您没有使用 BigO 计算确切的迭代次数。

当你有精确的迭代次数公式时,你可以 "derive" BigO。

BigO 仅提供迭代次数如何随着 N 的增长而增长的信息,并且仅针对 "big" N。

仅此而已。有了这个,您可以得出结论,如果您有一些样本运行,算法将花费多少 operations/time。

用 Tim Roughgarden 在他的算法课程中的话表达:

The big-Oh notation tries to provide a sweet spot for high level algorithm reasoning

这意味着它旨在描述算法时间执行与其输入大小之间的关系,避免依赖于系统架构、编程语言或所选编译器。

想象一下,大 Oh 表示法可以提供准确的执行时间,这意味着对于任何算法,只要知道其大 Oh 时间复杂度函数,就可以预测它在任何机器上的行为。

另一方面,它以渐近行为为中心。也就是说,它的描述对于大 n 值更准确(这就是为什么算法时间函数的低阶项在 big-Oh 表示法中被忽略的原因)。可以推断,较低的 n 值不需要您努力提高算法性能。

如果你做一些假设,你可以将时间估计到一个常数因子。大的假设是随着大小趋于无穷大的限制行为与您关心的问题大小的实际行为相同。

根据该假设,对于某个常数 C,大小 N 问题的时间上限是 C*log(N)。该常数将根据您用于计算对数的基数而变化。只要您对此保持一致,基础并不重要。如果您有一种尺寸的测量时间,您可以估计 C 并使用它来估计不同尺寸的时间。

例如,假设 100 题需要 20 秒。使用常用对数,C 是 10。(100 的常用对数是 2)。这表明大小为 1000 的问题可能需要大约 30 秒,因为 1000 的常见对数是 3.

但是,这很粗糙。该方法对于估计算法是否可用于大型问题最为有用。在这种情况下,您还必须注意内存大小。通常,设置问题的规模至少是线性的,因此其成本增长速度将快于 O(log N) 操作。