Arrays.copyOfRange() 的运行时间
Runtime of Arrays.copyOfRange()
Java 的 Arrays.copyOfRange(array, startIndex, endIndex) 函数的 big-O 运行时是多少?
例如,就 space 和时间复杂度而言,使用 copyOfRange 编写简单的数组函数二分搜索而不是传入开始和结束索引是否等效或效率较低?
例如 Arrays.copyRangeOf()
uses System.arraycopy()
which uses native code (could use memcpy - 取决于 JIT 实现)。
使用 System.arraycopy()
复制背后的 "magic" 是进行一次调用以复制内存块,而不是进行 n
不同的调用。
这意味着与您选择自己实施的任何其他解决方案相比,使用 Arrays.copyOfRange()
肯定会更有效。
此外,我看不出二进制搜索在这里有何帮助:数组可以直接访问 - 现在我们现在确切知道 src、dst 是什么以及我们应该复制多少项。
从大 O 的角度来看,复杂度为 O(n*k)
,其中 n
是要复制的项目数,k
是每个项目的大小(以位为单位)。 Space 复杂度是一样的。
Arrays.copyOfRange
需要线性时间——常数因子较低,但仍然是线性时间。操作开始和结束索引将不可避免地渐进地更快,O(log n) 而不是 O(n)。
Java 的 Arrays.copyOfRange(array, startIndex, endIndex) 函数的 big-O 运行时是多少?
例如,就 space 和时间复杂度而言,使用 copyOfRange 编写简单的数组函数二分搜索而不是传入开始和结束索引是否等效或效率较低?
Arrays.copyRangeOf()
uses System.arraycopy()
which uses native code (could use memcpy - 取决于 JIT 实现)。
使用 System.arraycopy()
复制背后的 "magic" 是进行一次调用以复制内存块,而不是进行 n
不同的调用。
这意味着与您选择自己实施的任何其他解决方案相比,使用 Arrays.copyOfRange()
肯定会更有效。
此外,我看不出二进制搜索在这里有何帮助:数组可以直接访问 - 现在我们现在确切知道 src、dst 是什么以及我们应该复制多少项。
从大 O 的角度来看,复杂度为 O(n*k)
,其中 n
是要复制的项目数,k
是每个项目的大小(以位为单位)。 Space 复杂度是一样的。
Arrays.copyOfRange
需要线性时间——常数因子较低,但仍然是线性时间。操作开始和结束索引将不可避免地渐进地更快,O(log n) 而不是 O(n)。