java是创建计数数字数组的最有效方法
制作给定长度的数组,每个元素都包含其下标,最有效的方法是什么
我的虚拟级别代码的可能描述:
/**
* The IndGen function returns an integer array with the specified dimensions.
*
* Each element of the returned integer array is set to the value of its
* one-dimensional subscript.
*
* @see Modeled on IDL's INDGEN function:
* http://idlastro.gsfc.nasa.gov/idl_html_help/INDGEN.html
*
* @params size
* @return int[size], each element set to value of its subscript
* @author you
*
* */
public int[] IndGen(int size) {
int[] result = new int[size];
for (int i = 0; i < size; i++) result[i] = i;
return result;
}
欢迎使用其他提示,如doc style
编辑
我在其他地方读到过for
循环与其他方法相比效率有多低,例如Copying an Array:
Using clone: 93 ms
Using System.arraycopy: 110 ms
Using Arrays.copyOf: 187 ms
Using for loop: 422 ms
这个网站上对一些问题的富有想象力的回答给我留下了深刻的印象,例如:Display numbers from 1 to 100 without loops or conditions。下面是一个可能会建议一些方法的答案:
public class To100 {
public static void main(String[] args) {
String set = new java.util.BitSet() {{ set(1, 100+1); }}.toString();
System.out.append(set, 1, set.length()-1);
}
}
如果你不能解决这个具有挑战性的问题,无需发泄:只需转到下一个你可以处理的未回答问题
# 1 楼答案
我唯一能想到的是使用“++i”而不是“i++”,但我认为java编译器已经有了这种优化
除此之外,这几乎是最好的算法
你可以创建一个类,它的行为就像它有一个数组,但它没有,它只会返回它得到的相同的数字(也就是标识函数),但这不是你所要求的
# 2 楼答案
正如其他人在回答中所说,您的代码已经接近我所能想到的最高效的代码,至少对于小型阵列来说是如此。如果您需要多次创建这些数组,而且它们非常大,您可以一次性创建所有数组,然后复制它们,而不是在for循环中不断迭代。如果数组非常大,复制操作将比在数组上迭代更快。可能是这样的(在本例中,最多1000个元素):
然后,根据需要多次创建这些数组的代码,您可以使用以下内容:
请注意,这样可以使用大量内存来提高速度。我想强调的是,只有当你需要多次创建这些阵列,阵列非常大,并且最大速度是你的要求之一时,这才是值得的。在我能想到的大多数情况下,你提出的解决方案将是最好的
编辑:我刚刚看到了您需要的大量数据和内存。我提出的方法需要n^2级的内存,其中n是期望的最大整数。在这种情况下,这是不切实际的,因为你需要大量的内存。算了吧。我离职是因为它可能对其他人有用
# 3 楼答案
由于一次使用TB内存是不可行的,尤其是同时使用它们进行任何计算,因此您可能会考虑使用生成器。(你可能计划在阵列上循环,对吧?)使用生成器时,不需要初始化数组(这样就可以立即开始使用它),而且几乎不使用内存(O(1))
我在下面提供了一个实现示例。它受到
long
原语的限制找到下面的用法演示