2012-02-17 20 views
0

私はmergesortアルゴリズムのために奇妙なランニングタイムを取得しています...同じ置換されたArrayListでアルゴリズム(1000回)を実行したいと思います。今、私はちょうどサイズ1000のArrayListの配列を作成し、これらのそれぞれをソートするのにかかる時間をとってから、時間の平均を取っています。同一の参照項目を複数回配列に格納すると、その参照項目がすべて変更に影響しますか?

私の質問は、同じリストを何度も何度もソートしていますか?配列のArrayListのインスタンスをインデックス0で変更すると、配列内の他のArrayListは同じ状態を維持しますか?私はそう思うだろうが、私はそれが起こっていないことを確認したいですか?ありがとう。

for (int N = 1000; N <= 10000; N += 1000) { 

     //copy the array 
     @SuppressWarnings("unchecked") 
     ArrayList<Integer>[] container = (ArrayList<Integer>[])new ArrayList[N]; 
     ArrayList<Integer> testArray1 = generatePermutedOrder(N); 
     for(int j=0; j<timesToLoop; j++){ 
     container[j] = testArray1; 
     } 

     System.out.print(N + "\t"); 

     // let things stabilize 
     startTime = System.nanoTime(); 
     while (System.nanoTime() - startTime < 1000000000) 
     ; 

     // time the routine 
     startTime = System.nanoTime(); 
     for (int i = 0; i < timesToLoop; i++) { 
      mergesort(container[i]); 
     } 
+0

はい同じArrayListオブジェクト(1つの 'new ArrayList()')を使用している場合、すべての操作は同じオブジェクトに対して行われます。幸いにもコピーを取ることは単純です - コンストラクタ/ addAll。 –

答えて

1

ArrayListには影響しません、アレイ内の他のArrayListは同じままでしょうか?

はい、ArrayListをインデックス0で変更しても、他のインデックスは変更されません。 (しかし、他のインデックスが同じのArrayListへの参照を持っていないことを確認してください)

のscenerio 1:(インデックス0を変更すると、インデックス1に影響します)

ArrayList[] arr = new ArrayList[2]; 
ArrayList aList = new ArrayList(); 

arr[0] = aList; 
arr[1] = aList; 

のscenerio 2:(インデックス0がインデックスに影響を与えない変更1)

ArrayList[] arr = new ArrayList[2]; 
ArrayList aList1 = new ArrayList(); 
ArrayList aList2 = new ArrayList(); 

arr[0] = aList1; 
arr[1] = aList2; 

したがって、あなたのコードでScenerio 2であることを確認してください。

EDIT:

ArrayList<Integer> testArray1 = generatePermutedOrder(N);  
for(int j=0; j<timesToLoop; j++) 
{   
    container[j] = testArray1; // same reference pointing to same ArrayList is added in each interation 
} 

あなたが各インデックスには同一の参照を追加しています。したがって、どのインデックスでも変更すると、残りのインデックスに影響します。

+0

ええ、私は問題があるかもしれないと思いますか? 1000の異なるArrayListを宣言することなく、ケース2を効率的に実行するにはどうすればよいですか(明らかに手で行うことはできません)。 –

+0

'ArrayList'の内容が同じなら、なぜそれを何度も何度もmergesortしたいのですか? – Azodious

+0

私はそれを複数回実行して平均時間を得ることができます。一度実行するだけでは、必ずしも平均的なケースを表すとは限りません。それにもかかわらず、それは私の教授が私がする必要があると言ったことです... –

0

はいもう一方ArrayListはそのままです。
たとえば、私は、インデックス0で言う配列にArrayListの1つのインスタンスを変更した場合

array[0].set(0,object) 

array[1]

0

あなたはArrayListの配列を作成しましたが、その配列の各スロットには何を割り当てましたか? 1つのArrayListインスタンスを作成して配列の1000個のスロットすべてに割り当てるか、または1000個の異なるArrayListを作成しましたか(ループ内でnewを使用するなど)、各配列スロットに異なる配列を割り当てましたか?

同じオブジェクトに複数の参照を複数の場所に保存すると、そのオブジェクトの変更がすべての参照を通じて表示されます。

0

ArrayListオブジェクトの配列を作成するだけの場合は、すべてnullです。その後、配列を繰り返し、各ArrayListをnewでインスタンス化すると、それらはすべて異なっています(新しいArrayList()を呼び出すたびに新しいものが作成されます)。

ArrayListを作成し、配列を反復し、配列の各要素に(既に作成された)ArrayListの値を割り当てることで、配列の各要素に同じArrayList参照を置くことができます。これはおそらくあなたがしたいことではありません。

関連する問題