在Java中声明大小为n的数组的运行时间是多少?我想这将取决于是否在垃圾回收中将内存清零(在这种情况下,内存可能为O(1))或在初始化时(这种情况下,内存必须为O(n))。
是O(n)
。考虑以下简单程序:
public class ArrayTest {
public static void main(String[] args) {
int[] var = new int[5];
}
}
生成的字节码为:
Compiled from "ArrayTest.java"
public class ArrayTest extends java.lang.Object{
public ArrayTest();
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: astore_1
4: return
}
要看的newarray
指令就是指令(只需搜索newarray
)。从VM规范:
从垃圾收集堆中分配一个新数组,该数组的html" target="_blank">组件类型为type且长度计数。对该新数组对象的引用arrayref被推入操作数堆栈。
新数组的每个元素都被初始化为该数组类型的默认初始值(第2.5.1节)。
由于每个元素都已初始化,因此需要O(n)
时间。
编辑
查看提供的链接amit,可以在恒定时间内以默认值实现数组初始化。所以我想它最终取决于JVM。您可以进行一些粗略的基准测试,看看是否是这种情况。
问题内容: 简单的问题。我曾尝试在Google上进行搜索,经过大约6次搜索后,我发现这里的搜索速度会更快。 SQL中的int有多大? 这个元素有多大?范围是多少?是2 ^ N还是N个字节长?(2 ^ 8N)?甚至我不知道的其他事情? 问题答案: 它取决于数据库。MySQL具有扩展名,其中INT(N)表示 显示宽度 为4个十进制数字的INT 。该信息保存在元数据中。 INT本身仍然是4个字节,并且可
问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)
我在GeekforGeekshttps://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/中检查“到达终点的最小跳跃次数”问题。我对这里提到的时间复杂度感到困惑,它是O(n^n)。 如果我看到上面的代码块,minJumps(arr,I,h)递归调用是从I=l1调用的。所以在每个递归步骤中,l(
null 在一个视频教程中,作者提到暴力方法是,阅读另一个答案,一个人认为是,另一个人认为是 强力是还是?更重要的是,您能说明您对蛮力方法执行了哪些分析以知道它是吗?
问题内容: 我正在生成关联数组,键值是1..n列的字符串连接。 有最大长度的钥匙会再次咬我吗?如果是这样,我可能会停下来并以不同的方式进行。 问题答案: 它似乎仅受脚本的内存限制的限制。 快速测试为我提供了128mb的密钥,没问题:
现在我用不同的测试场景测试它,总是比Kadena的结果更好。我不相信这样的运气,但找不到我错过了什么。你能看看这是否是一个有效的解决方案吗? 更新代码的思想是只跟踪一个子数组,并添加到其尾数,当数字很低时,和成为尾数组后的负集开始。另外,一开始的负面项目被忽略了。子数组的头只是向前移动。每次sum看起来是maximal-maxsum并且限制被更新。