Algorithm 简单算法问题

Algorithm 简单算法问题,algorithm,Algorithm,在iTunesU上观看免费的麻省理工学院算法课程,我被第一堂课困住了 以插入排序为例,在最坏的情况下(逆序数组/列表),它的时间实际上是T(n/2),但他们说这是θn的平方。我还以为这是西塔n。我不明白他们怎么说这是n平方。我被困住了,他们是如何得出这个结论的,维基百科也帮不上忙。有人能把它说得再哑一点吗 来自: 最坏情况下的输入是数组 按相反顺序排序。在这种情况下 内部循环的每次迭代都将 扫描并移动整个已排序的 之前数组的子部分 插入下一个元素。为此 大小写插入排序具有二次型 运行时间(即O(

在iTunesU上观看免费的麻省理工学院算法课程,我被第一堂课困住了

以插入排序为例,在最坏的情况下(逆序数组/列表),它的时间实际上是T(n/2),但他们说这是θn的平方。我还以为这是西塔n。我不明白他们怎么说这是n平方。我被困住了,他们是如何得出这个结论的,维基百科也帮不上忙。有人能把它说得再哑一点吗

来自:

最坏情况下的输入是数组 按相反顺序排序。在这种情况下 内部循环的每次迭代都将 扫描并移动整个已排序的 之前数组的子部分 插入下一个元素。为此 大小写插入排序具有二次型 运行时间(即O(n2))

第一个循环迭代数组/列表进行排序,内部循环迭代部分排序的数组/列表。如果已经排序,您可以看到每次都迭代到已排序容器的末尾

以下是伪文本的更多解释:

for element in unsorted_container
    for current_element in sorted_container
        if element < current_element -> Will never happen since sorted in reverse order.
            InsertBefore(element, current_element)
    if element not inserted
        InsertAtEnd(element) <- Will always execute this part since it will always insert at end.
未排序容器中元素的

对于已排序\u容器中的当前\u元素
如果元素将永远不会发生,因为按相反顺序排序。
InsertBefore(元素,当前元素)
如果元素未插入
插入(元素)来自:

最坏情况下的输入是数组 按相反顺序排序。在这种情况下 内部循环的每次迭代都将 扫描并移动整个已排序的 之前数组的子部分 插入下一个元素。为此 大小写插入排序具有二次型 运行时间(即O(n2))

第一个循环迭代数组/列表进行排序,内部循环迭代部分排序的数组/列表。如果已经排序,您可以看到每次都迭代到已排序容器的末尾

以下是伪文本的更多解释:

for element in unsorted_container
    for current_element in sorted_container
        if element < current_element -> Will never happen since sorted in reverse order.
            InsertBefore(element, current_element)
    if element not inserted
        InsertAtEnd(element) <- Will always execute this part since it will always insert at end.
未排序容器中元素的

对于已排序\u容器中的当前\u元素
如果元素将永远不会发生,因为按相反顺序排序。
InsertBefore(元素,当前元素)
如果元素未插入

插入趋势(元素)插入排序按相反顺序开始的4个元素的数组:

4 3 2 1
首先,将“4”插入长度为1的数组中的适当位置(即不执行任何操作)

接下来,将“3”插入长度为2的数组中的适当位置:

3 4 2 1
(我们必须移动3号和4号)

接下来,将“2”插入长度为3的数组中的适当位置:

2 3 4 1
(我们必须移动2、3和4)

接下来,插入“1”

(我们必须移动1、2、3和4)

我们执行了n个步骤,每个步骤k都需要移动k个元素(或k-1交换,取决于您想如何看待它)。从1到n的k之和是θ(n^2)

在一个简单的链表结构[*]的情况下,我们可以将一个对象移动到它在O(1)中的适当位置,但一般来说,找到适当的位置仍然需要对已经排序的数据部分进行线性搜索,因此对于一般输入,它仍然只得到O(n^2)。不过,链表的基本插入排序恰好能够很好地处理逆序数据,因为它总是能够立即找到正确的插入位置。因此,对于这个特定数据,我们得到了O(1)的n个步骤,每个步骤的总运行时间为O(n)

假设我们仍然选择要插入的第一个未排序元素,并且在每一步都向前搜索列表的已排序部分,那么列表插入排序的最坏情况是已经排序的数据,再次是θ(n^2)


[*]意思是,没有什么比跳过列表更奇特的了。

插入排序按相反顺序开始的4个元素的数组:

4 3 2 1
首先,将“4”插入长度为1的数组中的适当位置(即不执行任何操作)

接下来,将“3”插入长度为2的数组中的适当位置:

3 4 2 1
(我们必须移动3号和4号)

接下来,将“2”插入长度为3的数组中的适当位置:

2 3 4 1
(我们必须移动2、3和4)

接下来,插入“1”

(我们必须移动1、2、3和4)

我们执行了n个步骤,每个步骤k都需要移动k个元素(或k-1交换,取决于您想如何看待它)。从1到n的k之和是θ(n^2)

在一个简单的链表结构[*]的情况下,我们可以将一个对象移动到它在O(1)中的适当位置,但一般来说,找到适当的位置仍然需要对已经排序的数据部分进行线性搜索,因此对于一般输入,它仍然只得到O(n^2)。不过,链表的基本插入排序恰好能够很好地处理逆序数据,因为它总是能够立即找到正确的插入位置。因此,对于这个特定数据,我们得到了O(1)的n个步骤,每个步骤的总运行时间为O(n)

假设我们仍然选择要插入的第一个未排序元素,并且在每一步都向前搜索列表的已排序部分,那么列表插入排序的最坏情况是已经排序的数据,再次是θ(n^2)


[*]意思是,没有什么比跳过列表更奇特的了。

它不是真正的n平方,也不是很接近。在上一次迭代中,它只消耗了n个成本,其中j=n(j是循环位置)。我错过了一些东西。所以考虑到负载,它实际上是在5项数组上。(1) +(2)+(3)+(4)+(5)但是否等于O(n2)?@mattcodes:1+2+…+n=n*(n+1)/2,实际上是θ(n^2)。@mattcodes详细说明Eric和Steve的正确评论,即使您的操作仅为(n^2)/2,当您将N乘以两倍或四倍时,该表达式的N^2部分将清楚地显示出来。如果您正在处理一个具有此时间复杂性的问题,并且完成每个操作的时间为N=10000000000和1毫秒,则即使复杂性为(N^2)/2,而不是(N^2),在算法正确终止时,您也不会处于活动状态.还有