java - 求某些条件下归并排序的时间复杂度

标签 java sorting time-complexity mergesort

给定更改的合并排序算法,如果数组已经排序,算法将返回数组,而不是进行 2 次以上的递归调用。 假设我们在一个数组上运行新算法,其中每个值恰好出现 n/log(n) 次。 (为此,数组包含 log(n) 个不同的值)。

该算法的时间复杂度是多少?

最佳答案

如果您怀疑数组中的不同值很少,那么扫描数组以提取这些值、对它们进行排序并进行计数将比对数组执行完全合并排序花费更少的时间:

  • 如果您使用哈希表,选择值将花费 O(N) 时间,生成大小为 log(N) 的样本数组。
  • 对此样本数组进行排序应花费O(log(N).log(log(N)),与扫描阶段相比可以忽略不计。
  • 枚举样本数组以生成原始数组的副本也具有线性时间复杂度O(N)

因此时间复杂度可以降低到O(N)

但请注意:

  • 使用哈希表来构造示例数组可能不可行。相反,如果您构造一个排序列表,则由于每个元素都会线性查找示例数组,因此复杂性会跳回 O(N.log(N))
  • 如果原始数组的元素具有相同的键但内容不同,则生成元素的副本可能不够。在这种情况下,您将扫描原始数组并在示例数组中查找元素的键,以确定将元素存储在结果数组中的位置,同样是 O(N.log(N)) 时间复杂度如果示例数组是一个列表,则 O(N.log(log(N))) 如果它是一个数组并且您使用二分搜索。

综上所述,在特殊情况下可以有效降低复杂度,但在一般情况下却很棘手。

关于java - 求某些条件下归并排序的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883515/

相关文章:

java - 无法在 NVD3 中显示所有 X 轴刻度值

java - ZipOutputStream + FTPClient 中的错误

java - 使用 RTL 语言的正则表达式

sorting - 如何对带有 map 状闭包的Rust Vector进行排序?

java - 如何按每个键的值计数对 Guava MultiMap 进行排序

algorithm - 在 O(n) 中证明图灵机计数?

java - 使用 Spring Security 的 IP 过滤器

java - 如何不按键而是按值类的字段对映射进行排序?

c++ - STL 映射的迭代器++ 复杂性

algorithm - 我如何估计功能的增长?