作者H45 (!H45)
看板java
标题Re: [问题] 有没有办法取代或改善List的效率?
时间Wed May 23 13:17:46 2007
※ 引述《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