Java Arrays.parallelSetAll()的时间复杂度是多少?

Java Arrays.parallelSetAll()的时间复杂度是多少?,java,java-8,Java,Java 8,我刚读到: 因此,Java8添加了Arrays.parallelSetAll() [编辑]对于阵列中相同数量的元素,同一台机器上的时间复杂度是O(1)还是常数?方法名称表示哪种性能改进?首先,它不能是O(1),更多说明如下: 我使用的是n=array.length,在您的例子中是8,但是这并不重要,因为它也可能是一个非常大的数字 现在请注意,通常情况下,您会: for (int i = 0; i < n; i++) { array[i] = i.incrementAndGet();

我刚读到: 因此,Java8添加了Arrays.parallelSetAll()


[编辑]对于阵列中相同数量的元素,同一台机器上的时间复杂度是O(1)还是常数?方法名称表示哪种性能改进?

首先,它不能是O(1),更多说明如下:

我使用的是
n=array.length
,在您的例子中是
8
,但是这并不重要,因为它也可能是一个非常大的数字

现在请注意,通常情况下,您会:

for (int i = 0; i < n; i++) {
    array[i] = i.incrementAndGet();
}
观察它们都需要O(n)时间

现在考虑到您是并行执行代码的,但是无法保证它是如何执行的,您不知道它在引擎盖下执行了多少次并行化,如果有,那么对于如此低的数量

因此它仍然需要O(n)个时间,因为您无法证明它将在n个线程上并行

Edit,作为一个额外的例子,我观察到您似乎认为并行化一个动作意味着任何O(k)都将收敛到O(1),其中
k=n
k=n^2
,等等。
实际情况并非如此,因为您可以证明,您从来没有可用的
k
处理器内核

一个直观的论点是你自己的计算机,如果你幸运的话,它可能有8个核,因此在完美的并行化条件下,你能得到的最长时间是O(n/8)。
我已经听到未来的人们嘲笑我们只有8个CPU核…

这是
O(N)
。调用
Arrays.parallelSetAll(…)
涉及到设置
array.length
数组元素总数的赋值。即使这些赋值分布在
P
处理器上,赋值总数也与数组长度成线性比例。将
N
作为数组的长度,数学计算是显而易见的


要认识到的是,
p
。。。可用处理器的数量。。。对于单台计算机上任何给定的程序执行,都是一个常数。(或者,如果它不是常数,则会有一个常数的上限。)而仅用于为数组赋值的计算只有在单台计算机上执行时才有意义。

它怎么可能是O(1)?你没有无限多的CPU核。顺便说一句,我想你知道数组可能不包含升序的数字。如果确实希望它们按升序排列,则应使用:
int[]array=newint[8];parallelSetAll(数组,i->i)
。不能并行递增
AtomicInteger
。因此,当使用多个线程执行时,由该增量组成的操作可能会更慢。除此之外,您似乎还没有理解复杂性符号的
O(…)
。很好的解释。“未来评论”使我的日子:-)事实上,O-符号背后的理论对于并行计算机无处不在的世界来说已经不再足够了,并且考虑到未来内核数量将每两年翻一番的事实。可能有一些变通方法,比如说“它以O(n²/m)运行
n
核心上的
m
输入元素”,但据我所知,这背后并没有真正深刻的理论。(例如,在这样的理论中必须包括Amdahl/Gustafson somwhere)@Marco13-如果我们做出简化假设,即计算机上的核数是有界的,而问题的缩放参数是无界的,那么大O符号背后的数学也适用于多核计算机。@StephencOne可以说这只是一个理论结构,而这个理论本身与硬件无关。但正如O表示法的渐近性质及其“无限输入大小”与现实无关一样,所有程序运行在单个内核上的隐含假设也不再现实。至少应该考虑一个完全可并行的O(nLogn)算法或一个固有顺序O(n)算法之间的区别是否重要,或者核的数目是否应该包含在这个理论中。就我的2cents@Marco13-“……这一理论本身与硬件无关”。这是实际的,而不是理论的。我还没有遇到过处理器数量无限的计算机系统。(我认为物理定律可能对此有一些说法…)就像我说的,假设应用程序运行在一台有一定数量内核的计算机上。。。即使界限可能“相当大”。
for (int i = 0; i < n; i++) {
    array[i] = i.incrementAndGet();
}
Arrays.setAll(array, v -> i.incrementAndGet());