如何解决算法与输入大小成线性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)。
所以我们可以说这是线性时间复杂度算法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。