a.insert(0,x)是o(n)函数吗?a.append是一个O(1)函数吗?python

a.insert(0,x)是o(n)函数吗?a.append是一个O(1)函数吗?python,python,list,insertion,Python,List,Insertion,我试图将数组中的偶数移到数组的前面,将奇数移到数组的后面。这个问题要求在线性算法中执行此操作,并在适当的位置执行此操作 我想到了这个: def sort(a): for i in range(0,len(a)-1): if a[i]%2==0: a.insert(0,a.pop(i)) return a 问题是,有人告诉我,从技术上讲,a.insert是一个on函数,所以从技术上讲,当包含函数范围内的for i部分时,这将被视为一个非线

我试图将数组中的偶数移到数组的前面,将奇数移到数组的后面。这个问题要求在线性算法中执行此操作,并在适当的位置执行此操作

我想到了这个:

 def sort(a):
    for i in range(0,len(a)-1):
        if a[i]%2==0:
            a.insert(0,a.pop(i))
    return a
问题是,有人告诉我,从技术上讲,a.insert是一个on函数,所以从技术上讲,当包含函数范围内的for i部分时,这将被视为一个非线性算法。因为提出这个问题的论坛已经有几个月了,我无法要求解释

基本上,我相信他在技术上是这样说的,因为这会在前面插入它,它不会检查数组中的其他N个元素,因此它会在On而不是^2上运行。这是正确的评估吗

此外,论坛上有人使用a.append修改了上述内容,并将其更改为查找奇数。没有人回答,所以我想知道,a.append是否不是on函数,因为它将其移动到末尾?是o1吗

感谢您的解释和澄清

在列表的第0个索引处插入需要移动其他元素,使其成为ON操作。但是,如果使用的是O1,则此操作为O1

append是一个摊销的O1操作,因为它只需要将项目添加到列表的末尾,而不需要进行移位。有时列表需要增长,因此它并不总是O1操作。

在列表的第0个索引处插入需要移动其他元素,使其成为ON操作。但是,如果使用的是O1,则此操作为O1

append是一个摊销的O1操作,因为它只需要将项目添加到列表的末尾,而不需要进行移位。有时列表需要增长,因此它并不总是O1操作。

检查此项

插入 Append-O1列表被过度分配 检查这个

插入 Append-O1列表被过度分配
这是正确的-Python标准列表前面的插入处于启用状态。Python列表是作为数组实现的,因此在列表前面插入一些内容需要将整个内容移到一个位置。另一方面,追加不需要任何转移,因此摊销为O1

但是,请注意,a.popi也是一个On操作,因为它需要在弹出的项目之后将所有内容移到一个点上。因此,简单地将代码修改为使用append而不是insert仍然不会产生线性算法

线性时间算法不使用pop,而是执行类似交换元素的操作,这样就不必修改列表的其余部分。例如,考虑这一点:

def even_to_front(a_list):
    next_even = 0
    for idx in xrange(len(a_list)):
        if not a_list[idx] % 2:
            # a_list[idx] is even, so swap it towards the front
            a_list[idx], a_list[next_even] = a_list[next_even], a_list[idx]
            next_even += 1

这是正确的-Python标准列表前面的插入处于启用状态。Python列表是作为数组实现的,因此在列表前面插入一些内容需要将整个内容移到一个位置。另一方面,追加不需要任何转移,因此摊销为O1

但是,请注意,a.popi也是一个On操作,因为它需要在弹出的项目之后将所有内容移到一个点上。因此,简单地将代码修改为使用append而不是insert仍然不会产生线性算法

线性时间算法不使用pop,而是执行类似交换元素的操作,这样就不必修改列表的其余部分。例如,考虑这一点:

def even_to_front(a_list):
    next_even = 0
    for idx in xrange(len(a_list)):
        if not a_list[idx] % 2:
            # a_list[idx] is even, so swap it towards the front
            a_list[idx], a_list[next_even] = a_list[next_even], a_list[idx]
            next_even += 1
每次从列表中弹出元素时,都必须复制列表的尾随部分,将其移动到一个索引上,以填补删除的元素留下的漏洞。这是弹出元素和列表尾部之间的线性距离

每次在列表中插入元素时,都必须复制列表的尾部,将其移动到一个索引上,以创建插入新元素的点。在插入元素的位置和列表尾部之间的距离是线性的

如果使用collections.deque,可以在O1时间内将其追加并弹出到前面和后面。但是,从中间删除一个元素仍然是线性的,我认为您必须自己编写它。

每次从列表中弹出元素时,您都必须复制列表的尾部,将其移动到一个索引上,以填补删除的元素留下的漏洞。这是弹出元素和列表尾部之间的线性距离

每次在列表中插入元素时,都必须复制列表的尾部,将其移动到一个索引上,以创建插入新元素的点。在插入元素的位置和列表尾部之间的距离是线性的

如果使用collections.deque,可以在O1时间内将其追加并弹出到前面和后面。然而,从中间删除一个元素仍然是线性的,我认为您必须自己编写 无需追加/插入或退出队列即可完成

def sort(L):
    i, j = 0, len(L)-1
    while i<j:
        # point i to the next odd number from the start
        while i<j and not L[i]%2: i+=1
        # point j to the next even number from the end
        while i<j and L[j]%2: j-=1
        L[i],L[j] = L[j],L[i]    

下面介绍如何在不追加/插入或退出队列的情况下完成此操作

def sort(L):
    i, j = 0, len(L)-1
    while i<j:
        # point i to the next odd number from the start
        while i<j and not L[i]%2: i+=1
        # point j to the next even number from the end
        while i<j and L[j]%2: j-=1
        L[i],L[j] = L[j],L[i]    

实际上,对于append来说,它也只是一个摊销的O1,出于明显的原因,我们有时不得不增加列表。@好的,那么我将把它改为平均案例,并包含这些信息。请注意,平均案例复杂度与摊销复杂度不同。前者是一种具有平均但不是所有数据/参数的复杂度,后者适用于所有输入,并表示如果频繁重复操作,则每次操作的复杂度。也就是说,一个普通的O1追加案例也可能发生!对于一些列表,例如排序列表,当您重复追加时,摊销O1追加是O1,查看总时间,并将其平均-无论列表中有什么。实际上,它也只是追加的摊销O1,出于显而易见的原因,我们有时不得不增加列表。@好吧,那么我将把它改为平均案例,并包含这些信息。请注意,平均案例复杂性与摊销复杂性不同。前者是一种具有平均但不是所有数据/参数的复杂度,后者适用于所有输入,并表示如果频繁重复操作,则每次操作的复杂度。也就是说,一个普通的O1追加案例也可能发生!对于一些列表,例如排序列表,当您重复追加时,摊销O1追加是O1,查看总时间,并将其平均-无论列表中有什么。On是Oops。很抱歉,我的意思是,当您还将我编辑的问题的范围内的I作为因子时,它不是线性的。lst=[I for I in lst if not I%2]+[I for I in lst if I%2]是Oops。很抱歉,我的意思是,当您还将我编辑的问题的范围内的I作为因子时,它不是线性的。lst=[I for I in lst if not I%2]+[I for I in lst if I%2]嘿,回答得好。谢谢你教我,它把一切都转移到正确的方向。我不知道这是什么使它在另一个n元素上技术上工作!嘿,回答得好。谢谢你教我,它把一切都转移到正确的方向。我不知道这是什么使它在另一个n元素上技术上工作!谢谢你的那张桌子。在我前进的过程中,这绝对是无价的!谢谢你的那张桌子。在我前进的过程中,这绝对是无价的!