这个算法是否占用了太多的额外空间,以便#34;到位"?

时间:2018-04-17 12:02:53

标签: python python-3.x algorithm sorting

分配是从向量中对负数和正数进行排序。问题是算法必须是O(n)并且到位 我的解决方案"是:

def Rearrange(arr):
    neg = []
    pos = []
    for x in arr:
        if x < 0:
            neg.append(x)
        else:
            pos.append(x)
    return neg + pos

所以,我想知道这个算法是否到位?我知道循环和追加操作满足就地算法。但是存储值的列表呢?它是否使用太多额外空间来满足就地算法?如果确实如此,那么这个问题是否容易解决?现在我有点卡住了。

3 个答案:

答案 0 :(得分:2)

您是否需要对整个数组进行排序,或者只是左侧是负值而右侧是正值(和0)?

如果你想要实现的是第二件事,那么下面的函数应该可以工作(它可以正常工作,它是O(n)):

def rearrange(array):

    left = 0
    right = len(array) - 1

    while left < right:
        if array[left] >= 0 > array[right]:
            array[right], array[left] = array[left], array[right]
            left += 1
            right -= 1
        elif array[left] < 0:
            left += 1
        else:
            right -= 1

>>> array = [-5, 6, 7, -4, 2, 0, -1]
>>> rearrange(array)
>>> array 
[-5, -1, -4, 7, 2, 0, 6]

答案 1 :(得分:0)

没有。此解决方案尚未到位。创建了两个新对象(列表),您可以根据您指定的逻辑不断附加这些对象。

据我所知,您无法仅使用标准库获取数据的原位视图

如果现场解决方案对您很重要,您可以使用第三方库,例如numpy

如果O(n)解决方案很重要,您应该在list.append循环中使用生成器或for到2个列表。

答案 2 :(得分:0)

您无法更改变量inplace,但您可以使用以下内容O(n)

def rearrange(arr):
    result = []
    for i in arr:
        if i < 0:
            result.insert(0, i)
        else:
            result.append(i)
    return result

修改

根据@Chris_Rands提案,使用deque的解决方案似乎是最快的:

from collections import deque

def rearrange2(arr):
    result = deque()
    for i in arr:
        if i < 0:
            result.appendleft(i)
        else:
            result.append(i)
    return result

比根据28%结果的公认解决方案快%timeit

%timeit rearrange_accepted(nums)
100 loops, best of 3: 12.2 ms per loop

%timeit rearrange2(nums)
100 loops, best of 3: 8.84 ms per loop