Time complexity 时间复杂性-理解大θ

Time complexity 时间复杂性-理解大θ,time-complexity,Time Complexity,我目前正在学习算法和数据结构。经过近两个月的学习,我仍然觉得时间的复杂性非常令人困惑 我的教授告诉我,如果某个程序的大ω和大O不相等,大θ就不存在 我现在真的对我所学到的一切提出了质疑。我将以BubbleSort为例,使用大ω(n)、大θ(n^2)和大O(n^2)。大θ确实存在(当我分析它时,它是有意义的) 有谁能向我解释一下我的教授是错的还是我误解了什么?存在大O、大ϴ和大Ω O是上界 Ω是下限 ϴ存在的充要条件是O=Ω 从本质上讲,Big-O是最有用的,因为它告诉我们函数可能表现得最差 大-

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

我的教授告诉我,如果某个程序的大ω和大O不相等,大θ就不存在

我现在真的对我所学到的一切提出了质疑。我将以BubbleSort为例,使用大ω(n)、大θ(n^2)和大O(n^2)。大θ确实存在(当我分析它时,它是有意义的)


有谁能向我解释一下我的教授是错的还是我误解了什么?

存在大O、大ϴ和大Ω

  • O是上界
  • Ω是下限
  • ϴ存在的充要条件是O=Ω
  • 从本质上讲,Big-O是最有用的,因为它告诉我们函数可能表现得最差

    大-Ω表示它的最佳性能

    当最坏=最好时,你总是得到。这是个大问题。当函数的行为总是相同时

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

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

    鉴于:

    mergeSort() ∈ Ω(n * log n)
    mergeSort() ∈ O(n * log n)
    
    这意味着,在最佳情况下,合并排序在
    n*log n
    时间内,在最坏情况下。它总是
    n*log n
    。这是因为,无论输入是什么,merge-sort都会递归地将列表划分为半个大小的子数组,并在每个子数组的大小为1时将它们放回一起。但是,您只能将某个对象分成两部分多次(
    log2(n)
    )次。然后,每次调用
    mergeSort()
    一次
    log2(n)
    次的
    merge()
    例程,即
    O(n)
    。因此,对于
    mergeSort()
    的所有执行,都会得到
    n*log2(n)

    因此,我们可以作出更有力的声明,并说:

    mergeSort() ∈ ϴ(n * log n)
    
    我们只能在函数的运行时被完全相同数量级的函数上下限定的情况下做出这样的确定性陈述(使用大θ)

    我是怎么记得的:


    ϴ是一个终局,而O和Ω只是极限。

    存在大O、大ϴ和大Ω

  • O是上界
  • Ω是下限
  • ϴ存在的充要条件是O=Ω
  • 从本质上讲,Big-O是最有用的,因为它告诉我们函数可能表现得最差

    大-Ω表示它的最佳性能

    当最坏=最好时,你总是得到。这是个大问题。当函数的行为总是相同时

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

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

    鉴于:

    mergeSort() ∈ Ω(n * log n)
    mergeSort() ∈ O(n * log n)
    
    这意味着,在最佳情况下,合并排序在
    n*log n
    时间内,在最坏情况下。它总是
    n*log n
    。这是因为,无论输入是什么,merge-sort都会递归地将列表划分为半个大小的子数组,并在每个子数组的大小为1时将它们放回一起。但是,您只能将某个对象分成两部分多次(
    log2(n)
    )次。然后,每次调用
    mergeSort()
    一次
    log2(n)
    次的
    merge()
    例程,即
    O(n)
    。因此,对于
    mergeSort()
    的所有执行,都会得到
    n*log2(n)

    因此,我们可以作出更有力的声明,并说:

    mergeSort() ∈ ϴ(n * log n)
    
    我们只能在函数的运行时被完全相同数量级的函数上下限定的情况下做出这样的确定性陈述(使用大θ)

    我是怎么记得的:


    ϴ是最终的一切,而O和Ω只是极限。

    你是如何分析大ϴ最坏情况的复杂性的?你的教授是对的,如果你有严格的最坏情况下的大O和大Ω复杂度,并且它们不是同一类,那么算法就不可能有大Ω复杂度(特别是在这里,冒泡排序没有最坏情况下的大Ω,尽管你引用的大O和大Ω界限是正确的)。看起来就是这样。我们从来没有被告知我们实际上在分析严格的最坏情况,现在更有意义了。你是如何分析大的最坏情况的复杂性的?你的教授是对的,如果你有严格的最坏情况下的大O和大Ω复杂度,并且它们不是同一类,那么算法就不可能有大Ω复杂度(特别是在这里,冒泡排序没有最坏情况下的大Ω,尽管你引用的大O和大Ω界限是正确的)。看起来就是这样。从来没有人告诉我们,我们实际上是在分析最糟糕的情况,现在这更有意义了