Re: [問題] 有沒有辦法取代或改善List的效率?
※ 引述《superlubu (勁過呂布)》之銘言:
: ※ 引述《H45 (!H45)》之銘言:
: : 經測試,你的 Code 運作速度比原程式碼還慢
: : nodeNumber = 100,000
: : CHANCE_MOVE = 0.05
: : 原 PO 的版本: 217ms
: : 你的版本: 3000ms
: : 請問是不是哪裡有漏掉了呢?
: : (文末附上我的測試碼)
: Orz... 我忘了 ArrayList 頻繁的 remove 和 add 動作所需的時間要很多 Orz
: 該用 set(index, element) 才對,只要把 swapping 那幾句換成:
: originalRandomArray.set(i, ranInt);
: originalRandomArray.set(ranInt, curPos);
: // swap two numbers in pos ranInt and i
: 就可以把時間縮短為 78ms (原 PO 版本 109ms)
: 題外話: 若換成用 int[] 來作同一個問題,時間只用 19ms 囧rz
: 謝謝 H45 板友的覆查 <(_ _)>
嗯,沒錯,這樣一改確實快多了!
但我有其他的疑問 ._./
既然只是做出一個很大的隨機 Array
為何不使用 Random 給值就好了呢? 這樣快很多吧!
雖然會有循環數列的問題 (每 2^32 循環一次, 而且有規律...)
但我認為可以交由 setSeed 來解決
也就是每隔一段時間就換一個 seed 來產生亂數
如此一來,循環數列就不容易存在了(?
以下是我修改的 Code, 雖然效能很棒,但是不知道夠不夠亂??
(我已經捨棄 originalRandomArray 了)
public void GenerateRandomArray(int nodeNumber) {
Random random = new Random();
// 每隔 1000 個數列就換一個 seed
int threshold = 1000;
// 計算大迴圈要跑的次數
int loopCount = (int) (nodeNumber / threshold * CHANCE_MOVE);
randomArray.clear();
// 開始填亂數到 randomArray
for (int j = 0; j < loopCount; j++) {
random.setSeed(System.currentTimeMillis());
for (int i = 0; i < threshold; i++) {
randomArray.add(random.nextInt());
}
}
// 把剩下的部分也補完
loopCount = (int) (nodeNumber * CHANCE_MOVE % threshold);
random.setSeed(System.currentTimeMillis());
for (int i = 0; i < loopCount; i++) {
randomArray.add(random.nextInt());
}
}
nodeNumber = 100,000
CHANCE_MOVE = 0.05
Cost Time: 21 (比前兩個方法都快)
各位板友覺得如何呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.205.85
討論串 (同標題文章)