arrays - 排序列表的排序数组上的操作的时间复杂度
问题描述
我有一个 N 个元素的排序数组,它们平均分布在 K 个列表中,也被排序。以下情况的时间复杂度(以最严格的 Big-O 表示法)是多少:
- 删除最小的元素。
- 删除最小元素后重新排列数组。
- 删除所有 N 个元素
对于第一部分,我认为答案是O(1)
因为最小的元素是第一个元素。但它所在的列表不一定是第一个列表,所以我不确定。
对于第二部分,我不确定(也许O(NK)
?)
对于第三部分,它必须是O(N)
因为我们要遍历整个数组,但是我再次不确定
解决方案
具体的例子有帮助。假设您有三个列表(数组):
[7, 11, 15]
[3, 12, 19]
[2, 4, 6]
删除最小的项目需要您首先找到它。各个列表是有序的,但列表的列表不是。找到最小的项目需要 O(K) 时间,因为您必须对列表列表进行顺序扫描。
一旦你找到了最小的项目,将需要 O(m) 时间(其中 m 是包含最小项目的列表的大小)来删除它。原因是当您从列表中删除第一个项目时,所有其他项目都必须向上移动。那是:
[2, 4, 6]
变成[_, 4, 6]
了,然后你就得搬东西了[4, 6, _]
。(_
表示空值,或您用来表示“无价值”的任何标记值。)
我想你可以说移除是 O(1),然后重新排序数组是 O(m)。
您可以在 O(N) 时间内删除所有元素,前提是您不关心删除它们的顺序。如果要按排序顺序删除所有元素,则复杂度为 O(n * K),因为每次都必须找到最小的元素。您可以通过实现 K 路合并将其改进为 O(n * log(K)),代价是 O(K) 额外内存。
推荐阅读
- c - C2x:6.9.2 外部对象定义:为什么“不应是不完整的类型”放在语义而不是约束中?
- c - 如何修复警告“格式指定类型'void *'但参数具有类型'char'警告”
- android - 您上传的文件不是格式正确的 zip 存档
- shell - 如果我在脚本中导入,则无法使用 echo 命令
- excel - 如果单元格 = 0 或为空,则转到上一个单元格值
- python - 使用浏览器控制台绕过 hcaptcha
- python - 如何访问for循环中的下一个值
- tapkey - 是否可以通过 POST 请求撤销 tapkey 授权?
- azure - “测试什么?” 使用“分发给外部测试人员”时需要
- c++ - c++排序和快速排序算法和for循环问题