Java 使用仅使用单个代码行的表示法将多个元素分配给数组的时间复杂度是多少?
我指的是:Java 使用仅使用单个代码行的表示法将多个元素分配给数组的时间复杂度是多少?,java,arrays,time-complexity,Java,Arrays,Time Complexity,我指的是: int[] array = {1, 2 , 3, 4, 5}; 其中,为每个数组索引赋值是“全部在一行代码中”完成的 我真的不知道在这个背景下会发生什么, 但我想象的是,这就像是对数组中每个索引的迭代,然后将输入的int分配给该索引: for (int i = 0; i<array.length; i++){ array[i] = <given input> //for array[1] the value will be 1, array[2] is 2 an
int[] array = {1, 2 , 3, 4, 5};
其中,为每个数组索引赋值是“全部在一行代码中”完成的
我真的不知道在这个背景下会发生什么,
但我想象的是,这就像是对数组中每个索引的迭代,然后将输入的int分配给该索引:
for (int i = 0; i<array.length; i++){
array[i] = <given input> //for array[1] the value will be 1, array[2] is 2 and so on...
}
for(int i=0;i非常相关,请查看:
用于初始化数组的字节码包含newarray
指令,该指令为O(n),因为每个元素在初始化之前都被初始化为默认状态。请参阅:,第576页:
[…]新数组的每个元素都被初始化为数组类型的元素类型的默认初始值(§2.3,§2.4)
另外,您在这里使用的是一个字节码,所以让我们检查一下字节码:
公共类主{
公共静态void main(字符串[]args){
int[]数组={1,2,3,4,5};
}
}
…编译为
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: newarray int
3: dup
4: iconst_0
5: iconst_1
6: iastore
7: dup
8: iconst_1
9: iconst_2
10: iastore
11: dup
12: iconst_2
13: iconst_3
14: iastore
15: dup
16: iconst_3
17: iconst_4
18: iastore
19: dup
20: iconst_4
21: iconst_5
22: iastore
23: astore_1
24: return
}
正如您所看到的,您所显示的一条线性实际上是字节码级别的2*O(n)。非常相关,请查看:
用于初始化数组的字节码包含newarray
指令,该指令为O(n),因为每个元素在初始化之前都被初始化为默认状态。请参阅:,第576页:
[…]新数组的每个元素都被初始化为数组类型的元素类型的默认初始值(§2.3,§2.4)
另外,您在这里使用的是一个字节码,所以让我们检查一下字节码:
公共类主{
公共静态void main(字符串[]args){
int[]数组={1,2,3,4,5};
}
}
…编译为
public class Main {
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: newarray int
3: dup
4: iconst_0
5: iconst_1
6: iastore
7: dup
8: iconst_1
9: iconst_2
10: iastore
11: dup
12: iconst_2
13: iconst_3
14: iastore
15: dup
16: iconst_3
17: iconst_4
18: iastore
19: dup
20: iconst_4
21: iconst_5
22: iastore
23: astore_1
24: return
}
正如您所看到的,您所展示的一行代码实际上是字节码级别的2*O(n)。来自@akuzminykh的答案很好而且足够了
但是,您需要的是编译时数据准备
static final String STR = "....very long string ...";
该字符串在类的常量池中编译为UTF-8字符串。java字符串通常以UTF-16(2字节)字符数组的形式保存其数据,但最新的java版本可以保存字节数组及其编码。因此,假设我们的字符串常量就是这种情况
然后仍然需要复制字节。
因此,对于n个字节,仍然是O(n)。但是它会很快,而且(很可能)在本机代码端。一个1个字符的字符串的加载速度将比10000个字符的加载速度快。但实际效果可能无法测量,不适合优化。来自@akuzminykh的答案很好且足够
但是,您需要的是编译时数据准备
static final String STR = "....very long string ...";
该字符串在类的常量池中编译为UTF-8字符串。java字符串通常以UTF-16(2字节)字符数组的形式保存其数据,但最新的java版本可以保存字节数组及其编码。因此,假设我们的字符串常量就是这种情况
然后仍然需要复制字节。
因此,对于n个字节,仍然是O(n)。但是它会很快并且(可能)在本机代码方面。一个1个字符的字符串的加载速度将快于10000个字符。但实际效果可能无法测量,不适合优化。这样的代码通常由编译器进行优化,因此在运行时不会发生任何实际情况,因此无论数组有多大,您都只需将其保存在内存中。添加eleme对源代码的nts可能会使编译速度变慢,但数量不明显。是否为O(1),与任何其他变量赋值相同?它可能包含在我们的测试中,因此我最好知道它的具体答案。我真的很感激响应!这样的代码通常由编译器优化,以便在运行时不会发生任何实际情况,因此无论数组有多大,您都只需在内存中保存它。添加elem对源代码的注释可能会使编译速度变慢,但数量不明显。它是否为O(1),与对变量的任何其他赋值相同?它可能包含在我们的测试中,因此我最好知道具体答案。我非常感谢您的回复!