时间复杂性 - 理解大Theta

时间:2018-04-17 14:23:29

标签: time-complexity

我目前正在采用算法和数据结构。经过近两个月的学习,我仍然觉得时间复杂性极其令人困惑。

有人告诉我(我的教授),如果我的某些程序中的big-omega和big-O不相等,那么big-theta就不存在了。

我现在真的质疑到目前为止我所学到的一切。我将以BubbleSort为例,使用big-omega(n),big-theta(n ^ 2)和big-O(n ^ 2)。 Big-theta确实存在(当我分析它时它是有意义的。)

有人可以向我解释我的教授是错的还是我误解了什么?

1 个答案:

答案 0 :(得分:1)

存在大O,大Θ和大Ω。

  1. O是上限
  2. Ω是下限
  3. 当且仅当O =Ω时,
  4. Θ存在

    从本质上讲,Big-O是最有用的,因为它告诉我们一个函数可以表现得最差。

    Big-Ω表示它可以表现得最好。

    当WORST = BEST时,你总是得到。那是大Θ。当函数总是表现相同时。

    示例(优化的冒泡排序,然后在发生交换时具有布尔标志):

    bubbleSort() ∈ Ω(n)
    bubbleSort() ∈ O(n^2)
    

    这意味着,最好的冒泡排序可以做的是线性时间。但是,在最坏的情况下,它降低到二次时间。原因,在预先排序的列表中,冒泡排序表现得很安静,因为它在列表中进行了一次循环(n迭代)并退出。然而,在按降序排列的列表中,它将进行大约n(n-1)/2次迭代,这与n^2成比例。根据输入,冒泡排序的行为与DRASTICALLY(不同的顺序或大小)不同。

    鉴于:

    mergeSort() ∈ Ω(n * log n)
    mergeSort() ∈ O(n * log n)
    

    这意味着,在最好的情况下,合并排序在n * log n时间,在最坏的情况下。它总是n * log n。这是因为,无论输入是什么,merge sort总是递归地将列表分成半大小的子数组,并在每个子数组的大小为1时将它们重新组合在一起。但是,你只能在多次(log2(n))次。然后,merge() O(n)例程mergeSort()log2(n)次调用mergeSort()n * log2(n)次。因此,对于mergeSort() ∈ ϴ(n * log n) 的所有执行,您都会获得.results[] | .. | objects | select(has("general-info")) | [(.["general-info"]|.["full-name"]), (.. | .id? // empty)] | join("|")

    因此,我们可以发表一份更强有力的声明并说出:

    [."general-info"."full-name", (.. | .id? // empty)]
    

    如果函数的运行时间由完全相同数量级的函数限制在上下,我们只能做出这样的权威性陈述(使用大theta)。

    我怎么记得:

    Θ是一个全部的结束,而O和Ω只是限制。