2012-03-25 7 views
2

私はスタンフォードのオンラインコースに参加しました。今は最初のプログラミングの問題を解決しています。100000個の要素を持つリストの不思議な振る舞い

fileは、いくつかのランダムな順序(非整数が繰り返されていない)に(両方を含む)1 100,000 間のすべて10万整数を含みます。 の作業では、与えられたファイル内の反転の数を見つけることです(すべての行 は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] 

このプログラムは、小さな配列のために正常に動作しますが、質問からの大規模な配列のためには、適切な順序で数字の配列を印刷しません100000、私が期待しています。ランダムな場所で数字を省略します。

この予期しない動作の理由は何ですか?

+3

'for k in range(2 * n)' – katrielalex

+0

これは、その動作を引き起こしているリストの他のプロパティです(長さではありません)。 –

+0

@katrielalex、何が問題なのですか? –

答えて

2

n = len(a)を設定し、n * 2回だけをマージすると、aより長い場合はbが切り捨てられます。

これは、結果リストに2 ** 16の項目があるという顕著な事実を部分的に説明しています。

+0

私のコードは偶数長の配列で、各繰り返しで2等分されます。この場合も、小さな配列は正常に処理されます。 –

+2

@ SergeyFilkin、100000は偶数ですが、100000/2でもありますか? 100000/4? 100000/8? 100000/16? 100000/32 ...? – senderle

+0

ありがとう、それは私のばかげた:O) –

関連する問題