日期:2014-05-20  浏览次数:20655 次

随机置换问题如何处理?求思路。。。
我有12个文件
每个文件里均有一列double数值
每列数值都可以分成4个二维数组
现在想进行T次循环,
循环一次,通过随机置换每次都把各个文件的二维数组随机呼唤一遍,当然每个文件的每个二维数组都被呼唤至少一次


有点绕,不知道说明白没有,能不能给个思路?我现在想的是:
1,先把所有文件随机置换一遍,每次处理一个文件,在这个文件里把它自己的二维数组随机处理一遍,然后再进行下个文件。发现不对劲,没按照原题走。
2,然后我就想是不是可以把所有的12个文件的二维数组存到一个大的List里,然后进行随机呼换每个数组进行处理。但是感觉有点笨
3,又想了一下,是不是把12个文件放到一个文件里,列成12个列,但是没办法随机抽取对应的二维数组

达人还有什么方法吗?谢谢啦


------解决方案--------------------
把12行数据放成1行就可以了
每行有个基数,比如第一个文件基数 是 0 用fileIndex表示第二个文件就是1了

那么循环时用Math.abs(new Random().nextInt()%4+ fileIndex*4)
这样随即置换就可以了。
array[];
for(int i=0;i<48;i++){
int rd = Math.abs(new Random().nextInt()%4+ fileIndex*4;
swap(i,rd);//交换
}
楼主是这么个意思吗?

------解决方案--------------------
如果文件不大的话,建议还是全部Load到内存中,做成二维数组处理,处理完毕后再回写文件。否则直接基于文件进行交换,你的IO复杂度太高了。

另外因为你要求:每个文件的每个二维数组都被呼唤至少一次。

建议顺序处理这个二维数组的每一个元素,但是每次置换时,用随机数选来则置换目标。2楼的算法其实也就是这个意思了,只不过是基于一维数组的。
------解决方案--------------------
主要考虑是,你如果要基于文件直接进行处理,进行抽取交换的代价比较高:
每次交换都需要重新写文件,而且你的文件还不是定长结构,所以写进去的数字长度会导致整个文件的重排。

比如你刚好要交换:A文件的第一个数 10 <--> B文件的第三个数 99.88
那么这两个数长度是不一样的,你为了让交换立即反映回文件去,重写的时候相当于要重写整个文件。

所以,反正你的数据规模不大,全部装载进内存进行运算,然后再重写所有文件,效率肯定是最高的。


另外,有一点没有太清晰:是不是你A文件的数字只会在A文件内部随机交换?如果是这样的话,也可以逐个文件处理,不需要一次性装载所有文件。甚至可以并发多线程处理,反正文件之间互不相干。