我试图将数组中的偶数移到数组的前面,将奇数移到数组的后面。该问题要求在线性算法中执行此操作并就地执行此操作。
我想到了这个:
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 是一个 o(n) 函数,所以从技术上讲,这将被视为非线性算法(当包含 for i in range 时功能的一部分)。由于提出这个问题的论坛已有几个月的历史,我无法寻求解释。
基本上我相信他说的是“技术上”,因为因为这会将它插入到前面,所以它不会检查数组中的另外 N 个元素,因此使其在 O(n) 而不是 O(n) 时出于实际目的运行^2).这是正确的评估吗?
还有,论坛上有人用a.append修改了上面的,改成找奇数。没有人回复所以我想知道,a.append 不是 o(n) 函数,因为它将它移动到最后吗?是o(1)吗?
感谢您的解释和澄清!
请您参考如下方法:
insert 在列表的第 0 个索引处需要移动所有其他元素,这使其成为 O(N) 操作。但是,如果您使用 deque这个操作是 O(1)。
append 是一个分摊的 O(1) 操作,因为它只需要将项目添加到列表的末尾并且不进行任何移动。有时列表需要增长,因此它并不总是 O(1) 操作。
