我想在java上實現Fisher-Yates shuffle算法。它可以工作,但是當我的ArrayList的大小大於100000時,它會變得非常慢。我會告訴你我的代碼,並且你看到了優化代碼的方法嗎?我對ArrayList中的.get和.set的複雜性做了一些研究,它對我來說是O(1)。排序算法太慢ArrayList
更新1:我注意到我的實現是錯誤的。這是適當的Fisher-Yates算法。此外,我還包括我的next()
功能,以便你們可以看到它。我使用java.Random進行了測試,看看我的next()
函數是否是問題,但它給出了相同的結果。我相信問題出在我的數據結構的使用上。
更新2:我做了一個測試,ArrayList是RandomAccess的一個實例。所以問題不在那裏。
private long next(){ // MurmurHash3
seed ^= seed >> 33;
seed *= 0xff51afd7ed558ccdL;
seed ^= seed >> 33;
seed *= 0xc4ceb9fe1a85ec53L;
seed ^= seed >> 33;
return seed;
}
public int next(int range){
return (int) Math.abs((next() % range));
}
public ArrayList<Integer> shuffle(ArrayList<Integer> pList){
Integer temp;
int index;
int size = pList.size();
for (int i = size - 1; i > 0; i--){
index = next(i + 1);
temp = pList.get(index);
pList.set(index, pList.get(i));
pList.set(i, temp);
}
return pList;
}
忘了提及,next(int size)給我一個介於0到size之間的隨機數。 – Paul 2014-10-08 12:46:19
所以下一次使用「編輯」; D,請向我們展示next()方法,因爲它可能也是瓶頸。 – user2504380 2014-10-08 12:48:05
顯示下一個()方法的代碼......這可能是花了這麼長時間。 – brso05 2014-10-08 12:49:27