使用分而治之的方法找到一个数组的反转

时间:2012-03-27 03:28:50

标签: python algorithm inversion

我遇到了a post in SO,其中算法是用python代码实现的。这是this article中伪代码的直接实现。

但是,在伪代码中,有一行,其中count由数组'a'中剩余元素的数量递增。在上面的python代码中,它被赋予为

count += len(a) - i

我们不能这样做吗

count += len(a[i:])

此外,而不是

c += a[i:] + b[j:]

我写道,

c.append(a[i:])
c.append(b[j:])

总的来说,我的版本看起来像这样

def merge(left,right):
    i=0
    j=0
    count=0
    c=[]
    while i<len(left) and j<len(right):
        c.append(min(left[i],right[j]))
        if right[j]< left[i]:
            count+=len(left[i:])
            j+=1
        else:
            i+=1
    c.append(left[i:])
    c.append(right[j:])
    return count,c


def dnc(input):
    if len(input)==1:
        return 0,input
    mid=len(input)/2
    left=input[:mid]
    right=input[mid:]
    l,left=dnc(left)
    r,right=dnc(right)
    m,result=merge(left,right)
    count=l+r+m
    return count,result

唉!,当我在排序的数组上计算它时,我得到3而不是0

if __name__=='__main__':
    input =[1,2,3,4,5]
    ct,res=dnc(input)
    print ct

我做错了什么?有人可以帮我找出来吗?

1 个答案:

答案 0 :(得分:6)

以下是我的建议:

  • 不要count += len(a[i:])。它比原来慢,并且不必要地使逻辑变得复杂。我会将len(a)缓存为len_a,并在循环外计算一次,因为a似乎没有被修改。

  • c += a[i:] + b[j:]c.extend(a[i:])c.extend(b[j:])相同。 extend将列表的内容附加到c,而append会附加列表本身,这可能会导致您的问题。