两个for循环的时间复杂度
这个问题在这里已经有了答案:
由于大O符号不是关于比较绝对复杂度,而只是相对的,O(n + n)实际上与O(n)相同。 每次你加倍x,你的代码将会花费两倍于之前的时间,这意味着O(n)。 无论您的代码是通过2,4或20个循环运行都无所谓,因为无论100个元素需要多少时间,200个元素需要两倍的时间,10,000个元素需要100倍的时间,无论多少时间花费在哪个循环中。
这就是为什么大O不会说绝对速度的原因。 无论谁认为O(n ^ 2)函数f()总是比O(log n)函数g()慢,都是错误的。 大O符号只是说,如果你继续增加n,就会有一个点g()以速度超过f(),然而,如果n在练习中总是低于那个点,那么f()可以在实际的程序代码中总是比g()快。
例1
我们假设f(x)对于单个元素需要5ms,对于单个元素g(x)需要100ms,但是f(x)是O(n ^ 2),g(x)是O(log2n)。 时间图如下所示:
注:最多7个元素,即使它是O(n ^ 2),f(x)也会更快。
对于8个或更多元素,g(x)更快。
例2
二进制搜索是O(log n),理想的散列表(没有冲突)是O(1),但相信我,散列表并不总是比现实中的二进制搜索更快。 使用一个好的散列函数,散列一个字符串比整个二进制搜索要花费更多的时间。 另一方面,使用较差的散列函数会产生很多冲突,并且冲突越多意味着您的散列表查找实际上不会是O(1),因为大多数散列表以一种方式解决冲突,这种方式将使查找为O(log2 n)或甚至O(n)。
这将是2n,所以是的,你是对的。
它通常只是表示为O(n),虽然它是线性的而不是二次的。
它当然取决于循环内的代码,但我想你已经知道了。
链接地址: http://www.djcxy.com/p/6745.html