algorithm - 将 arraylist 转换为小于 O(n) 的数组
问题描述
我目前正在开发程序并希望将 ArrayList 转换为数组,但时间少于 O(n)。
for (int i = 0; i < list.size(); i++) {
if (list.get(i) != null) {
arr[i] = list.get(i);
}
}
解决方案
如果 n 是列表的长度,那么 O(n) 意味着在这种情况下,您查看列表中的每个元素并复制它。
现在你说你想在小于 O(n) 的时间内转换它。这意味着您必须忽略列表中的某些元素。如果不是,它将再次是 O(n)。但是你忽略了哪个?请记住,您不允许查看所有其他元素,否则它将再次出现在 O(n) 中。
假设您知道该列表包含布尔值,其中 n/2 为真,其他为假。在最好的情况下,所有真实值都在列表的前半部分。现在您可以在列表的 n/2 处停止迭代,但您需要再次将错误值添加到您的数组中。现在你又在 O(n) 了。
让我们再做一个假设。您始终可以忽略列表的最后一个值。这意味着您只迭代 n-1 次,然后是 O(n-1) 但在大 O 表示法中,您忽略常量,因此它再次获得 O(n)。
不可能将列表的所有 n 个元素复制到低于 O(n) 的数组中。
推荐阅读
- c# - SSIS 脚本任务 - 使用 C# 将 VARCHAR 转换为 NVARCHAR
- php - PHP Thruway + Authobahn.js = 426,如何将 websockets 与 pub/sub 一起使用?
- arrays - sortOn():试图对一个数组的副本进行排序,但原来的也在排序中
- json - 在 Angular 6 的组件中处理来自 observable 的数据
- powershell - 链接的 powershell 替换命令是否一个接一个地执行?
- mysql - 多余额用户的数据库设计
- android - 如何在 Android Emulator 中模拟重启动作?
- c - 在 C(netbeans)中向二进制文件写入和读取结构不起作用
- sql - 创建视图时可以有这样的列
- java - 无法在 Spring Boot 项目中自动装配数据源