Re: [問題] 有沒有辦法取代或改善List的效率?

看板java作者 (!H45)時間18年前 (2007/05/23 13:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串9/12 (看更多)
※ 引述《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
文章代碼(AID): #16KyvxSi (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 9 之 12 篇):
文章代碼(AID): #16KyvxSi (java)