两个for循环的时间复杂度

这个问题在这里已经有了答案:

  • 如何找到算法的时间复杂度10个答案
  • “大O”符号的简单英文解释是什么? 36个答案

  • 由于大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

    上一篇: Time Complexity of two for loops

    下一篇: what is the meaning of O(1), O(n), O(n*n) memory?