我目前正在开发程序,想将ArrayList转换为数组,但时间少于O(n)。
for (int i = 0; i < list.size(); i++) {
if (list.get(i) != null) {
arr[i] = list.get(i);
}
}
答案 0 :(得分:0)
如果n是列表的长度,则O(n)在这种情况下意味着您查看列表中的每个元素并将其复制。
现在,您说要转换为小于O(n)的值。这意味着您必须忽略列表中的某些元素。如果不是,它将再次为O(n)。但是您忽略了哪些?请记住,不允许您再次查看所有其他元素,否则将再次出现在O(n)中。
假设您知道列表包含布尔值,其中n / 2为true,其他为false。在最佳情况下,所有真实值都在列表的前半部分。
现在您可以在列表的n / 2处停止迭代,但是您需要再次将false值添加到Array中。现在您又回到O(n)。
让我们做另一个假设。您始终可以忽略列表的最后一个值。这意味着您只迭代n-1次,然后是O(n-1),但是使用大O表示法时,您将忽略常量,因此它将再次获得O(n)。
不可能将列表的所有n个元素都复制到O(n)以下的Array中。