Java代码更高效

时间:2015-10-04 06:54:35

标签: java

我在这里创建代码,但我相信有一种方法可以提高效率。我尝试了很多方法,但似乎没有用。

protected void randomise() {
        int[] copy = new int[array().length]; //This makes the new int called randomIndex
        // used to indicate if elements have been used
        boolean[] used = new boolean[array().length]; //calling "used" as a new boolean for the array
        Arrays.fill(used,false);
        /**
         * if index = 0, it means their is nothing in the index. 
         * if you apply a random number, it will copy that number to an array called index.
         * if randomIndex in use, then the boolean becomes true.
         */
        for (int index = 0; index < array().length;) { 
            do {
                randomIndex = randomIndex();
            } while (used[randomIndex]); //when random is in use, do the follow instruction.
            copy[index] = array[index]; //copy the value value to an array called index.
            used[randomIndex] = true; //when randomIndex is in use, then it becomes true.
        }



        //Of course, if there an extra  random stores in the array, the index list is increased by one (index++).
        for (int index =0;index < array().length; index++) {
            array()[index] = copy[index]; //This tells where to copy the index value. in this case, it is a index array.
        }

3 个答案:

答案 0 :(得分:0)

您是否必须使用randomIndex

如果不是,您可以使用bool[]消除do {} while(),将值依次添加到copy(这不是一个好名字)并选择范围内的randInt未选择的元素的len,然后使用bool[]计算遍历array元素(以便为copy中的下一个元素做出选择。

答案 1 :(得分:0)

您似乎想要随机重新排序数组。如果是这样,那么确实有一个更有效的解决方案。您目前在输入的大小(O(n))上保留两个额外的数组,而您不需要。

随机改组是一个常见问题,显然已经提出了几种算法来完成这项任务。最有效的算法之一是Knuth's algorithm for random permutation

算法的想法是,在数组上循环一次,并且对于每个数字i,在i和0和i之间的(随机)数组索引之间执行随机交换。这样可以保证数组被洗牌(意味着每个项目都有相同的可能性放置在每个数组索引中),在O(n)时间内不使用任何额外的空间。

简而言之,

 for (int i = 0; i < index; i++) {
     int r = random.nextInt(i + 1);
     exchange(array, i, r);
 }

答案 2 :(得分:0)

很简单 - 使用一些索引集合并在使用它时删除元素。这种方式应该如下:

List<Integer> indexes = new ArrayList<>(array.length);
for (int i = 0 ; i < array.length ; i++) {
    indexes.add(i);
}

Random r = new Random();
while (indexes.size() > 0) {
    int randomIndex = r.nextInt(indexes.size());
    int index = indexes.remove(randomIndex);
    copy[index] = array[index];
}

请注意:

  • 你应该检查什么是精确的收集会在你的情况下更有效率
  • 另一种方法 - 为数组创建列表值,并在此列表中使用Collections.shuffle方法。
  • 另外一种方法 - 使用一些递归算法来完成这项工作。