`log(n)`基数是10吗?

时间:2014-08-29 16:39:37

标签: algorithm divide-and-conquer

仍然掌握对数为opposite of exponentials。 (将它们描述为指数的反转也是正确的吗?)

Big-O notation已经有很多很棒的SO条目,包括O(log n)QuickSort n(log n)。找到了一些有用的graphs

在查看Divide and Conquer算法时,我遇到n log n,我认为n乘以log n的值。我经常尝试像100 log 100这样的具体例子来帮助想象抽象方程式中的内容。

请阅读log n假设base 10n log n会转换为:

"数字n乘以数量10需要提升到幂的数量,以便等于数字n"?

所以100 log 100等于200,因为10需要被提升到2的幂,等于100?

当算法迭代一组时,基数是否会发生变化?如果我们在抽象中说话,那么基数是否重要?

5 个答案:

答案 0 :(得分:7)

是的,基数的确会根据迭代的方式而改变,但这并不重要。您可能还记得,更改对数的基数意味着将它们乘以常数。既然你提到你已经读过有关Big-O表示法的内容,那么你可能已经知道常量没有区别(O(n)与O(2n)或O(1000n)相同)。

编辑:澄清你说的话 - "我遇到了n log n,我认为是n乘以log n"的值。是的,你是对的。如果你想知道为什么它涉及log n,那么想想像分而治之的做什么算法 - 它们在每次迭代期间分割输入(两半或四分之四或十分之十,取决于算法)。问题是"在算法结束之前,该输入可被拆分多少次?"那么你看看输入并试着找出你可以将它除以2,或4或10的次数,直到操作毫无意义? (除非算法的目的是尽可能多地划分0)现在你可以给自己一些具体的例子,从简单的东西开始,比如" 8次可以分为2次?"或者"" 1000可以分多少次10?"

答案 1 :(得分:5)

基地根本不重要。事实上,人们倾向于放弃部分操作,例如如果有人O(n^4 + 2*n),则通常会减少到O(n^4)。在比较算法时,只需要考虑最相关的功率 对于比较两个密切相关的算法(比较O(n^4 + 2*n)而不是O(n^4 + 3*n)),需要包含线性相关性以保存相关信息。

考虑基于二分法的划分和征服方法:你的基数是2,所以你可以谈论ld(n)。另一方面,您使用O符号通过相同的基础比较不同的算法。话虽如此,ldlnlog10之间的差异只是一般偏移的问题。

答案 2 :(得分:5)

你不必担心基础 - 如果你正在处理算法的复杂性,那么你所依赖的基础并不重要,因为差异只是一个常数因素。

从根本上说,你只需要知道log n意味着随着n呈指数增长,运行时间(或使用的空间)会线性增加。例如,如果n = 10需要1分钟,则n = 100将需要2分钟,而n = 1000将需要3分钟 - 大致。 (它通常就上限而言,忽略较小的因素......但这是它的一般要点。)

n log n只是log n乘以n - 所以所花费的时间或空间比线性地增加了#34;基本上是#34。

答案 3 :(得分:2)

对数和指数是逆运算。

if
x^n = y

then
Logx(y) = n

例如,

10^3 = 1000
Log10 (1000) = 3

通过将问题分成几部分然后作为独立问题解决,划分和征服算法。还可以组合这些部件的组合步骤。大多数分而治之的算法都是基数2,这意味着它们每次都会将问题减少一半。例如,二进制搜索就像在电话簿中搜索名称一样。你翻到中间然后说..我在上半场或上半场寻找的是这个名字吗? (在您翻转之前或之后),然后重复。每次执行此操作时,您将问题的大小除以2.因此,它是基数2,而不是基数10.

订单表示法主要仅涉及运行时的“顺序”,因为在尝试确定问题是否易于处理时(在合理的时间内可解决),这是最重要的。

不同订单的例子如下:

O(1)
O(n)
O(n * log n)
O(n^2 * log n)
O(n^3.5)
O(n!)

这里的O代表“大O符号”,它基本上提供了函数增长率的上限。因为我们只关心大输入函数的增长...我们通常忽略低阶项,例如

n^3 + 2 n^2 + 100 n 

将是

O(n^3) 

因为n ^ 3是最大的有序项,它将主导大N值的增长函数。

当你看到O(n * log n)时,人们只是缩写...如果你理解算法它通常是Log base 2,因为大多数算法将问题减少了一半。但是,例如,如果算法将问题减少到三分之一,它可以是对数库3。

注意:

在任何一种情况下,如果您要绘制生长函数的图形,它将显示为对数曲线。但是,当然O(Log3 n)会比O(Log2 n)快。

您没有看到O(log10 n)或O(log3 n)等等的原因是,算法以这种方式更好地工作并不常见。在我们的电话簿示例中,您可以将页面拆分为3个独立的三分之一,并在1-2和2-3之间进行比较。但是,你刚刚进行了2次比较,结果知道名字的位数是1/3。但是,如果你每次知道哪个1/4更有效,你就把它分成两半。

答案 4 :(得分:1)

在我所知的大量编程语言中,函数log()旨在 base e=2.718281...

在数学书籍中,有时它意味着基础“十”,有时基础“ e ”。

正如另一个答案所指出的那样,对于big- O 表示法并不重要,因为对于所有基数x,复杂性O(log_x (n))与{{O(ln(n))相同1}}(此处 log_x 表示“base x 中的对数”,ln()表示“base e 中的对数”)。

最后,通常情况下,在分析几种算法时,考虑log()确实是“基数 2 ”中的对数更为方便。 (我看过一些采用这种方法的文本)。这显然与计算机中数字的二进制表示有关。