在所有来源中,算法的复杂性表示为 log N(未指定基数)。这是指以 2 为底的对数。
但是这样的对数有自己的名称lb。此外,这个名称是由ISO 31-11标准化的,使用它可能更合乎逻辑和正确,但由于某种原因这不起作用,为什么?
UPD:我没有任何数学背景,我对对数的了解只是它是指数的倒数。
让我们举一个具体的例子——二分查找。它的复杂性到处都被描述为log N。同时,在我看来, log N仍然意味着 N 以 2 为底的对数,因为 操作数正好是 N 以 2 为底的对数,即 必须提高 2(而不是 10 和不是 100)的幂才能得到 N。因此,老实说,我不理解诸如“因为O(n)表示法中的常数系数无关紧要”或“因为带有大 O 的符号对常数没有反应 - 使用哪个对数无关紧要......”我会很感激一个更详细的答案,不是为数学家写的。“大 O 中的常数无关紧要”的规则是否适用于对数的底?不管它的复杂性是写成以 2 为底还是以 100 为底的对数,它对二分搜索没有任何影响吗?
如果二进制搜索的log N表示以 2 为底的对数,那么为什么不将其写为lb N,因为二进制对数有自己的名称,而不是在不指定底数的情况下编写它?
UPD 2:我理解“O(N) 绝不是比较次数,它是对算法运行时间的估计,最大限度地与实现细节和机器解耦。”
但是这个:“并且由于具有大 O 的记录对常数没有反应 - 使用哪个对数无关紧要......”我不明白。为什么使用哪个对数无关紧要?以下是三个对数的图表 - 二进制、自然和以 0.5 为底:
让我们采用相同的二分搜索。我们能否将其复杂性替换为从 2 到 10 的对数底?从 2 到 0.5?我不认为我们可以。那些。我们不能在表达式 log N 中替换任意基数,因为依赖性将完全不同 - 这可以在图表中清楚地看到。那。使用哪个对数很重要。还是我错了?

因为所有的对数都是相同的,直到一个常数:)
而且由于具有大 O 的记录不会对常数做出反应,因此使用哪个对数并不重要......
更新您的问题更新。
意义不在于具体的比较次数,而在于这个数量(以及运行时间)如何随着 N 的增长而增长。这绝不是特定操作的具体数量!某些算法的复杂度为O(g(N))的事实只是意味着,如果我们通过实验建立一些算法运行时间对 N 的依赖性的函数并得到一些f(N),那么我们可以找到一些这样的常数c和N 0,对于所有N>=N 0 ,不等式0 <= f(N) <= cg(N)将成立。这是大 O 条目的定义。
再一次 - O(N) 绝不是比较次数,它是算法运行时间的估计,最大限度地与实现细节和机器解耦。
更新 2
我正在实现一个二分搜索算法,我非常愚蠢,所以我做了 20 个比较,而不是一个比较。你做多少就做多少。但是你和我的实现都将在 O(log N) 时间内运行——让我的运行速度比你的慢 100 倍。因为我和你的 N 增加 100 倍的实现都会在一段时间内工作更长的时间——即使每个人都有自己的,比如说,对你来说一分钟,对我来说——一个小时。最主要的是依赖的类型将是相同的 - 增加几倍,增长会有所增加。
顺便说一句,您的log 2 x和ln x依赖项完全相同 - 您只需要稍微更改沿y轴的比例即可。至于以小于 1 为底的对数 - 正如他们所说,你不应该夸大其词。但即使在这里 - 取模或负常数就足够了:)
顺便说一下,在这里查看一些链接。
我想我找到了原始问题的答案:
“在所有来源中,算法的复杂性都表示为 log N(不指示底数)。这意味着以 2 为底的对数。但是对于这样的对数,有一个名称 lb。此外,这个名称是由 ISO 31 标准化的- 11 并且可能会更合乎逻辑和正确使用它,但由于某种原因这不起作用,为什么?
在这里: https ://en.wikipedia.org/wiki/Logarithm#Particular_bases
那些。例如,在计算机科学中,使用 log N 而不是 lb N 或 log N 在特定的底数中,因为从上下文中可以清楚地看出对数的底数。
正如@Harry 回答的那样,对于O-big,对数的底数可能根本不重要。但是,老实说,我目前的数学知识还不足以对这种说法进行评估。因此,我现在更喜欢“基础由上下文决定”这一事实的更笼统的措辞
UPD:我在一本关于算法的书(仅在二进制搜索部分)中遇到过这样的短语:“它是以 2 为底数、以 10 为底数还是自然对数?在上面的示例中,以 2 为底数适用。但是,由于大 O 符号只关注性能的形状,实际基础并不重要。” 所以,是的,看起来对数的底并不重要)