Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在某些条件下查找合并排序的时间复杂性_Java_Sorting_Time Complexity_Mergesort - Fatal编程技术网

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

Java 在某些条件下查找合并排序的时间复杂性,java,sorting,time-complexity,mergesort,Java,Sorting,Time Complexity,Mergesort,给定一个已更改的合并排序算法,如果数组已排序,则该算法将返回该数组,而不是再进行两次递归调用。 假设我们在一个数组上运行新算法,其中每个值正好出现n/log(n)次。(为此,数组包含log(n)个不同的值) 该算法的时间复杂度是多少?如果您怀疑数组中几乎没有不同的值,则扫描数组以提取这些值,对它们进行排序和计数所需的时间将大大少于对数组执行完全合并排序所需的时间: 如果使用哈希表,选择值将花费O(N)时间,生成大小为log(N)的样本数组 对该样本阵列进行排序的时间应为O(log(N).log

给定一个已更改的合并排序算法,如果数组已排序,则该算法将返回该数组,而不是再进行两次递归调用。 假设我们在一个数组上运行新算法,其中每个值正好出现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))如果是一个数组,则为二进制搜索

总之,在特殊情况下可以有效地降低复杂性,但在一般情况下却很棘手。

听起来像是你在写作业。因此,第一步:你对这个问题有什么想法?我会给你一个提示。在O(n)中您可以从列表中提取唯一项的时间。因为您知道每个唯一项的数量,所以可以对这个较小的列表进行排序,然后在O(n)时间内,通过创建一个新数组,按排序顺序为每个项创建正确数量的副本来构造实际结果。如果您发现您的排序有O(n)或者更高的复杂度,这些操作不会改变排序的复杂度。-因此,问题被简化为只对唯一项进行排序,其中有日志(n)。