Re: [問題] 有沒有辦法取代或改善List的效率?
※ 引述《Mewra ()》之銘言:
: Collections.shuffle( originalRandomArray );
: randomArray.clear(); // initialize
: for( int i = 0 ; i < originalRandomArray.size() ; i++ )
: {
: if( i < nodeNumber * CHANCE_MOVE )
: {
: randomArray.add( originalRandomArray.get( i ) );
: }
: }
這一部份的 codes... 可以改成為:
Random randMachine = new Random(System.currentTimeMillis());
randomArray.clear();
for (int i=0; i<nodeNumber * CHANCE_MOVE; i++) {
if (i >= originalRandomArray.size()) break; // prevent overflow
int ranInt = randMachine.nextInt(originalRandomArray.size() - i) + i;
int ranTarget = originalRandomArray.get(ranInt);
// get the number in pos [ranInt]
int curPos = originalRandomArray.get(i);
// get the number in pos [i];
originalRandomArray.remove(ranInt);
if (ranInt != i) originalRandomArray.remove(i);
originalRandomArray.add(i, ranTarget);
if (ranInt != i) originalRandomArray.add(ranInt, curPos);
// swap two numbers in pos ranInt and i
randomArray.add(ranTarget);
// add the random number to the result
}
這就做到了 random 抽出 nodeNumber * CHANCE_MOVE 個數的目的,而且是 O(n)
剛測試過... 若是 nodeNumber = 1000000, CHANCE_MOVE = 0.05
時間是五分三十八秒 XD
--
《為了要得到真相,就要向原 PO 伸圖》
那就是伸圖魔人的沒圖沒真相原則,那時我們堅信那就是逼逼死的真實
靠么,圖咧?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 147.8.130.225
※ 編輯: superlubu 來自: 147.8.130.225 (05/23 11:31)
討論串 (同標題文章)