Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向ArrayList后面添加大量新项的时间复杂性_Java_Arraylist_Big O - Fatal编程技术网

Java 向ArrayList后面添加大量新项的时间复杂性

Java 向ArrayList后面添加大量新项的时间复杂性,java,arraylist,big-o,Java,Arraylist,Big O,将like100000元素添加到使用默认大小创建的ArrayList的末尾会有多复杂 好的,在ArrayList的末尾添加一个元素将变成O(1),但是在末尾添加像100000这样的元素会有多复杂呢 我原以为是O(n),但有人说应该是O(n^2)。 什么是正确的,为什么是正确的?ArrayListJavadoc声明: 添加操作在摊销的固定时间内运行,即添加n个元素需要O(n)个时间 如果有人提出相反的观点,他们最好有充分的理由反驳Java创建者,但就目前的问题而言,没有什么可以反驳的,因为没有提出

将like
100000
元素添加到使用默认大小创建的ArrayList的末尾会有多复杂

好的,在
ArrayList
的末尾添加一个元素将
变成O(1)
,但是在末尾添加像
100000这样的元素会有多复杂呢

我原以为是
O(n)
,但有人说应该是
O(n^2)

什么是正确的,为什么是正确的?

ArrayList
Javadoc声明:

添加操作在摊销的固定时间内运行,即添加n个元素需要O(n)个时间


如果有人提出相反的观点,他们最好有充分的理由反驳Java创建者,但就目前的问题而言,没有什么可以反驳的,因为没有提出任何论据。(“有些人说”不是很权威…。

ArrayList
Javadoc声明:

添加操作在摊销的固定时间内运行,即添加n个元素需要O(n)个时间


如果有人提出相反的观点,他们最好有充分的理由反驳Java创建者,但就目前的问题而言,没有什么可以反驳的,因为没有提出任何论据。(“有些人说”不是很权威…。

影响O(n)之外插入的唯一因素是容量增长。增长有多快?如果您逐个插入元素,则容量不会在每次插入时进行调整,但实际上很少进行调整。你为了效率而牺牲空间。因此,如果通过插入另一个元素,您达到了容量限制,它将大约增加1.5倍(在Sun实现中)。如果从10开始,您需要对100K元素进行多少这样的调整?大约25。。。在这25次调整中,只有最后两次调整的大小与N相当,因此,如果系数不变,则为O(N)


但是,您没有指定如何插入这些项目。您可以预先设置容纳100K元素的容量,或者使用
addAll
,我希望您也可以这样做。仍然是O(N)

影响O(N)之外插入的唯一因素是容量增长。增长有多快?如果您逐个插入元素,则容量不会在每次插入时进行调整,但实际上很少进行调整。你为了效率而牺牲空间。因此,如果通过插入另一个元素,您达到了容量限制,它将大约增加1.5倍(在Sun实现中)。如果从10开始,您需要对100K元素进行多少这样的调整?大约25。。。在这25次调整中,只有最后两次调整的大小与N相当,因此,如果系数不变,则为O(N)


但是,您没有指定如何插入这些项目。您可以预先设置容纳100K元素的容量,或者使用
addAll
,我希望您也可以这样做。仍然是O(N)

显然,这将取决于ArrayList的实现(它何时增长/多久增长一次/增长到多少)。它增长得越多,Java中默认ArrayList的复杂性就越接近O(n)@Kon 100000个元素。新的ArrayList();谁说是O(n^2)?你可以问他们在想什么。他们可能以为你说了
LinkedList
@DavidWallace当我遇到这个人时一定会问)@DavidWallace
LinkedList
在Java中是一个双链接列表,引用最后一个元素和第一个元素。向其末尾添加元素是一个固定的时间(因此它需要费心实现
Deque
),显然它将取决于ArrayList的实现(它何时增长/增长的频率/增长到多少)。它增长得越多,Java中默认ArrayList的复杂性就越接近O(n)@Kon 100000个元素。新的ArrayList();谁说是O(n^2)?你可以问他们在想什么。他们可能以为你说了
LinkedList
@DavidWallace当我遇到这个人时一定会问)@DavidWallace
LinkedList
在Java中是一个双链接列表,引用最后一个元素和第一个元素。将元素添加到它的末尾是恒定时间(因此它费心实现
Deque
)答案是正确的,但论据却不是。正如您现在的回答所示:“您需要O(log(n))调整大小和O(n)恒定时间加法,所以总O(n)”。但是,调整大小需要时间,容量是线性的。因此,这个参数的实际结果是O(n*log(n))。您缺少了一个关键部分,即随着调整大小开始花费更多的时间,它们的发生频率也会降低。等等,等等。它是O(n),与是否预设容量无关。问题是将有日志(n)大小调整,它们将采取2,2^2,2^3。。。2^log(n)-1次(假设加倍以便于格式化)。只有最后一次调整需要n的一半时间,其他的要小得多,这是关键部分。如果你对它们求和,你会得到sum(i=0..log(n)-1,2^i)=>n。让我考虑一下这一点。你是对的,只是最后两次调整的大小与n的总数相当,因此作为一个常数,总体复杂度仍然是O(n)。答案是正确的,但论据却不正确。正如您现在的回答所示:“您需要O(log(n))调整大小和O(n)恒定时间加法,所以总O(n)”。但是,调整大小需要时间,容量是线性的。因此,这个参数的实际结果是O(n*log(n))。您缺少了一个关键部分,即随着调整大小开始花费更多的时间,它们的发生频率也会降低。等等,等等。它是O(n),与是否预设容量无关。问题是将有日志(n)大小调整,它们将采取2,2^2,2^3。。。2^log(n)-1次(假设加倍以便于格式化)。只有最后一次调整需要n的一半时间,其他的要小得多,这是关键部分。如果你对它们求和,你会得到sum(i=0..log(n)-1,2^i