【问题标题】:What is the Value of LogN [duplicate]LogN的值是多少[重复]
【发布时间】:2015-12-16 07:32:30
【问题描述】:

所以我一直在研究大 O 表示法(Noob),大多数东西对我来说都像是外星语言。现在我了解日志的基本知识,例如 base2 的 log 16 是 2 的幂等于数字 16。现在对于二进制搜索大 O(logN) 对我来说毫无意义,LogN 的值是什么,这里的基数是什么?我在网上搜索过,问题是每个人都用数学解释了这个我无法理解我数学不好。有人可以用基本英语而不是像指数这样的外星语言向我解释这一点。我知道二进制搜索的工作原理。

第二个问题:[我什至不知道 f = Ω(g) 这个符号是什么意思] 谁能用简单的英语向我解释这里需要什么,我不想要答案,只是这意味着什么。 题 : 在以下每种情况下,请说明是 f = O(g),还是 f = Ω(g),或两者兼而有之。 (在这种情况下 f = Θ(g))。

f(n)              g(n)

(a) n-100 .............n-200

(b) 100n + logn .......n + (log n)2

(c) log2n ...... log3n

【问题讨论】:

  • " 现在对于二进制搜索大 O(logN) 对我来说毫无意义,LogN 的值是什么,这里的基数是什么?" :在大 O 表示法中,底数无关紧要。 SO上有很多很好的答案,.....
  • 在大 O 表示法中,我认为复杂性 O(log N) 是一个问题,其复杂性与该问题中的位数成正比。因此,9999 规模的问题将是 99 规模问题的两倍。如果您必须在没有提示的情况下从 0 到 99 猜测一个数字,则找到该数字是 O(N)。对数字 0 到 9999 做同样的事情显然要困难 100 倍。现在,如果您有“更高/更低”的提示,这将使问题成为 O(log N)。在那种情况下,从 0 到 9999 找到一个数字的难度只有从 0 到 99 的两倍
  • 对日志忽略基数的原因是它们都是彼此的常数倍数(并且在大 O 表示法中忽略了常数倍数)。查找日志的“基础更改”公式。一般来说,log_a(x) == log_b(x) / log_b(a) == log_10(x) / log_10(a) == ln(x) / ln(a).
  • “我数学不好。”然后get数学好。如果你想了解计算机编程,你需要很好地掌握基础数学。至少高中代数和三角学。
  • cs.stackexchange.com 是您提出这个问题的地方。您的问题与编程无关。

标签: algorithm sorting big-o


【解决方案1】:

更新:我刚刚意识到我是从 MIT 的视频中学习算法的。这是link to the first of those videos。继续下一节课,只要你愿意。


很明显,如果不确定 n 是什么以及我们使用的日志基础是什么,Log(n) 就没有任何价值。经常提及 log(n) 的目的是帮助人们了解特定算法或代码的增长率。它只是为了帮助人们正确看待事物。要建立您的观点,请参阅下面的比较:

1 < logn < n < nlogn < n2 < 2^n < n! < n^n

上面那行说在数轴上n 的某个值之后,上面写的函数的增长率是在那里提到的顺序。这样,决策者可以决定他们想采用哪种方法来解决他们的问题(学生可以通过算法设计和分析考试)。

关于您的问题,当书籍说“二进制搜索的运行时间是 Log(n)”时,本质上它们的意思是如果您有 n 个元素,则二进制搜索的运行时间将与 Log(n ) 如果您有 17n 个元素,那么您可以在与 Log(17n) 成比例的持续时间内从算法中得到答案。在这种情况下,Log 函数的基数是 2,因为在二分查找中,我们在每个节点上都有准确的 <= 2 路径可供选择。

因为,通过乘以一个常数,可以很容易地将 log 函数的基数从任何数字转换为任何其他数字,告诉基数是什么变得无关紧要,因为在大 O 表示法中,常数被忽略了。


关于第二个问题的答案,图片将是最好的解释。

Big O 只是关于函数的上限。在下图中,f(n) = O(g(n))。换句话说,存在正常数 c 和 k,使得对于所有 n ≥ k,0 ≤ f(n) ≤ cg(n)。

  • k 的重要性在于,在“k”之后,这个大 O 将保持为真,无论 n 的值是多少。如果我们无法修复“k”,我们就不能说增长率将始终低于 O(...) 中提到的函数。
  • c 的重要性在于它是 O(...) 之间的 函数 非常重要。


Omega 只是大 O 的反演。如果 f(n) = O(g(n)),则 g(n) = Ω(f(n))。换句话说,Ω() 是关于您的函数保持高于 Ω(...) 中提到的另一个“k”和另一个“c”的给定值。

图形可视化是


最后,Big theta 是关于找到一个数学函数,该函数的增长速度与您给定的函数相同。但是你如何证明这个函数和你的函数运行一样。通过使用两个常量值。

由于它与您给定的函数运行相同,您应该能够将两个常量 'c1' 和 'c2' 相乘,这将能够将 c1 * g(n) 放在函数 f(n) 之上并将 c2 * g(n) 低于你的函数 f(n)。

Big theta 背后的目的是提供一个具有相同增长率的函数。请注意,可能没有常数“c”能够使 f(n) 和 g(n) 重叠。没有人关心这个。唯一需要考虑的是能够使用两个常数将 f(n) 夹在 g(n) 之间,这样我们就可以自信地说我们找到了 f(n) 的增长率。​​p>


如何将以上学到的想法应用到您的问题中?

让我们一一介绍。您可以使用一些在线工具来绘制这些函数,并亲眼看看这些函数在沿着数轴方向时的表现。

  • f(n) = n - 100 和 g(n) = n - 200

在这里,可以通过区分两个函数 wrt n 来找出增长率。 d(f(n))/dn = d(g(n))/dn = 1。因此,即使 f(n) 和 g(n) 的运行时间可能不同,但它们的增长率是一样的。你能选择 'c1' 和 'c2' 使得 c1 * g(n)

  • f(n) = 100n + log(n) 和 g(n) = n + 2(log (n))

区分并判断您是否可以将这些函数关联为 Big O 或 Big Theta 或 Big Omega。

  • f(n) = log (2n) 和 g(n) = log (3n)

同上。

(图片取自本网站不同页面:http://xlinux.nist.gov/dads/HTML/)


我的经验:尝试比较很多不同功能的增长率。最终,您将掌握所有这些方法的窍门,并且对您来说将变得非常直观。考虑到一两个星期的集中努力,这个概念对任何人来说都不会是深奥的。

【讨论】:

  • 感谢您的回答,我想我太菜鸟了,无法从您的回答中得到一件事:(
  • @MansurAhamed:那么请先阅读最后一段。
【解决方案2】:

首先,让我们看一下符号。我从这些问题中假设 O(f) 是上限, Ω(f) 是下限,并且 Θ(f) 两者都是

在这种情况下,对于 O(log(N)),通常不会给出基数,因为无论基数如何,log(N) 的一般形式都是已知的。例如,


(来源:rapidtables.com

因此,如果您已经研究过二进制搜索算法(如果您还没有,我建议您这样做),您应该会发现最坏的情况(上限)是 log_2(N)。因此,给定 N 个术语,在最坏的情况下需要“log_2(N) 次计算”才能找到该术语。

关于第二个问题,

您只是在比较 f 和 g 的计算运行时间。

f = O(g)

是当 f 是 g 的上限时,即 f 肯定会比 g 花费更长的时间来计算。或者,

f = Ω(g)

是当 f 是 g 的下界时,即 g 肯定会比 f 花费更长的时间来计算。最后,

f = Θ(g)

当 f 既是 g 的上界又是下界时,即运行时间相同。

您需要比较每个问题的两个函数,并确定哪个函数需要更长的时间来计算。正如 Mitch 提到的,您可以查看已回答此问题的 here

编辑:不小心链接了 e^x 而不是 log(x)

【讨论】:

  • 感谢您的回答,这正是我在问题中提到的内容,我不理解诸如 log(N) 的一般形式之类的术语,无论其基数如何。我只能将日志视为具有基础。还有什么是 log_2(N)?。 is 2 是这里的基数,或者是 2 和 N 的乘积。
  • 对不起,学校的坏习惯。在这种情况下,log_2(n) 表示日志基数 2(因为这是二进制搜索)。我只是为了绝对清楚而将其包括在内。通常在任何类型的算法运行时讨论中,碱基都被完全丢弃,因为它们是不相关的。例如,您永远不需要实际计算 log_2(N),您只需要知道 O(log(N) 比 O(N) 快,但比 O(N log(N)) 慢。
【解决方案3】:

从未指定日志的基础的原因是因为它实际上是完全不相关的。您可以通过三个步骤说服自己:

首先,回忆一下 log_2(x) = log_10(x)/log_10(2)。但还记得 log_10(2) 是一个常数,我们称之为 k2,所以实际上,log_2(x) * k2 = log_10(x)

其次,回想一下,这不是以 2 为底的对数所独有的。转换的常数各不相同,但所有对数函数都通过乘法常数相互关联。

(如果您了解 log 函数背后的数学原理,您可以自己证明这一点,或者您可以在电子表格上非常快速地处理它——有一列 log_2(x) 和一列 log_3(x) 和分开他们。)

最后,请记住,在 Big Oh 表示法中,常量基本上是不相关的。试图区分 O(log_2(N)) 和 O(log_3(N)) 就像试图区分 O(N) 和 O(2N)。这是一个无关紧要的区别,因为 log_2 和 log_3 是通过常量关联的。

老实说,日志的基础并不重要。

【讨论】:

  • 谢谢,log_2(x) = log_10(x)/log_10(2) 怎么样。你能进一步解释一下吗?
  • @MansurAhamed 我认为这是一个错误。 Novak 的意思可能是 log_2(x) = log_10(x) * log_10(2)。但他试图说明的逻辑是合理的。
  • 哈哈!抱歉,在我做到之前确实没有错误。我会留下评论以保持连续性,但我承认我不正确。
猜你喜欢
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多