我目前正在采用算法和数据结构。经过近两个月的学习,我仍然觉得时间复杂性极其令人困惑。
有人告诉我(我的教授),如果我的某些程序中的big-omega和big-O不相等,那么big-theta就不存在了。
我现在真的质疑到目前为止我所学到的一切。我将以BubbleSort为例,使用big-omega(n),big-theta(n ^ 2)和big-O(n ^ 2)。 Big-theta确实存在(当我分析它时它是有意义的。)
有人可以向我解释我的教授是错的还是我误解了什么?
答案 0 :(得分:1)
存在大O,大Θ和大Ω。
从本质上讲,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和Ω只是限制。