查找某些条件下合并排序的时间复杂度

时间:2019-04-27 18:16:20

标签: java sorting time-complexity mergesort

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

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

1 个答案:

答案 0 :(得分:1)

如果您怀疑数组具有很少的不同值,则扫描数组以提取这些值,对它们进行排序和计数,比对数组执行完全合并排序所花的时间要少得多:

  • 如果您使用哈希表,则选择值将花费 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))),如果您是数组并且您使用二进制搜索。

结论是,在特殊情况下可以有效降低复杂性,但在一般情况下则很棘手。