具有100000个元素的列表上的奇怪行为

时间:2012-03-25 11:41:17

标签: python

我已加入Standford在线算法设计课程,现在我正在解决第一个编程问题。

  

file包含1到100,000之间的所有100,000个整数   (包括两者)以某种随机顺序(不重复整数)。您的   任务是找到给定文件中的反转次数(每行   有1到100,000之间的单个整数)。假设您的阵列来自   1到100,000和文件的第i行为您提供了第i个条目   阵列。

更新:我发现我的代码仅适用于2 ^ n情况。问题在于代码,而不是Python。我已更新代码,现在它工作正常,我已完成测验。感谢所有帮助过的人

固定代码是:

 def merge_count_split (a, b):
        c = []
        inv = 0
        i=0
        j=0
        for k in range( len(a) + len(b) ):
                if i < len(a) and j < len(b):
                        if a[i] < b[j]:
                                c.append(a[i])
                                i += 1
                        elif a[i] > b[j]:
                                c.append(b[j])
                                inv += len(a)-i
                                j += 1
                elif i == len(a):
                        c.append(b[j])
                        j += 1
                elif j == len(b):
                        c.append(a[i])
                        i += 1
        return c, inv

def count_inv (data):
        n = len(data)
        if n == 1:
                return data, 0
        a, x = count_inv(data[:n/2])
        b, y = count_inv(data[n/2:])
        c, z = merge_count_split(a,b)
        return c, x + y + z

with open('IntegerArray.txt') as f:
        array = [int(line) for line in f]
        print count_inv(array)[0]

这个程序适用于小型数组,但对于大型数组而言,它按照正常的顺序打印 65536 数字的数组,而不是100000,正如我所期望的那样。它在随机位置省略了数字。

python出现意外行为的原因是什么?

1 个答案:

答案 0 :(得分:2)

通过设置n = len(a)并仅合并n * 2次,如果b长于a,则会截断{{1}}。

这部分解释了结果列表中有2 ** 16项的惊人事实。