算法与输入大小成线性On,但是如果输入大小为指数,该怎么办

问题描述

讲师说,算法的复杂度通常根据其输入大小来衡量。

因此,当我们说算法是线性的时,即使您给它输入大小为2 ^ n(例如2 ^ n是二叉树中的节点数),算法仍然与输入线性大小?

以上内容似乎是讲师的意思,但我很难将其转过头来。如果给它一个2 ^ n输入,它与某个参数“ n”呈指数关系,但是将此输入称为“ x”,则可以肯定,您的算法对x是线性的。但是,从头到尾,它在'n'还是不是指数式的?说它与x的线性关系有什么意义?

解决方法

如果算法具有线性时间复杂度,则无论输入大小如何,它都是线性的。无论是固定大小的输入,二次方还是指数输入。

显然,在固定大小的数组(平方或指数)上运行该算法将花费不同的时间,但复杂度仍为O(n)


也许这个例子可以帮助您理解,在大小为16的数组上运行merge-sort是否意味着merge-sort是O(1),因为对数组进行排序需要花费一定的时间?答案是否定的。

,

每当您看到“线性”一词时,您都应该问-线性用什么?通常,当我们说算法的运行时间是“线性时间”时,我们的意思是“算法的运行时间是O(n),其中n是输入的大小。”

您要询问的是,如果n = 2 k ,并且我们正在将指数大小的输入传递给函数。在这种情况下,由于运行时间为O(n)且n = 2 k ,则整个运行时间为O(2 k )。在此陈述与算法以线性时间运行这一事实之间并没有矛盾,因为“线性时间”的意思是“线性关系是输入大小的函数。”

请注意,我明确选择在表达式2 k 中使用其他变量k,以引起注意以下事实:这里确实存在两个不同的数量-输入大小为a k的函数(即2 k ),而变量n更一般地表示函数的输入大小。您有时会看到这种组合,例如“如果算法的运行时间为O(n),则在大小为2 n 的输入上运行算法需要时间O(2 n )。”该陈述是正确的,但解析起来有些棘手,因为n在那儿扮演着两个不同的角色。

,

当我们说算法为O(n)时,意味着如果输入大小为n,则它与输入大小成线性关系。因此,如果n在另一个参数k上是指数(例如n = 2^k),则该算法在输入大小方面也是线性的。

另一个示例是二进制搜索大小为n的输入数组的时间复杂度。我们说二进制搜索大小为n的排序数组在O(log(n))中。这意味着对于输入大小,最多需要渐近log(n)比较才能在大小为n的输入数组中搜索项目,

,

假设您要打印前n个数字,并且要打印每个数字,则需要进行3次操作:

n-> 10,操作次数-> 3 x 10 = 30

n-> 100,操作次数-> 3 x 100 = 300

n-> 1000,操作次数-> 3 x 1000 = 3000

n-> 10000,我们也可以说n = 100 ^ 2(例如k ^ 2), 操作次数-> 3 x 10000 = 30,000 即使n是某物的指数(在这种情况下为100),我们的运算次数也仅取决于输入的数(n为10,000)。

所以我们可以说这是线性时间复杂度算法。