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
Algorithm 合并mergeSort和heapsort的算法的运行时间是多少?_Algorithm_Sorting_Mergesort_Heapsort - Fatal编程技术网

Algorithm 合并mergeSort和heapsort的算法的运行时间是多少?

Algorithm 合并mergeSort和heapsort的算法的运行时间是多少?,algorithm,sorting,mergesort,heapsort,Algorithm,Sorting,Mergesort,Heapsort,我遇到了这个问题,它要求计算一个与mergeSort完全相同的算法的最坏运行时间,但两个递归调用中的一个被Heapsort替换 所以,我知道在mergesort中进行除法需要恒定的时间,并且合并是O(n)。Heapsort接受O(nlogn)。 这就是我得出的结论:T(n)=2T(n/2)+O((n/2)logn)+O(n)。 我对O((n/2)logn)部分有一些疑问。是n还是n/2?我之所以写n/2,是因为我只在数组的一半上执行heapsort,但我不确定这是否正确。问题是关于运行时间,但它

我遇到了这个问题,它要求计算一个与mergeSort完全相同的算法的最坏运行时间,但两个递归调用中的一个被Heapsort替换

所以,我知道在mergesort中进行除法需要恒定的时间,并且合并是O(n)。Heapsort接受O(nlogn)。 这就是我得出的结论:T(n)=2T(n/2)+O((n/2)logn)+O(n)。
我对O((n/2)logn)部分有一些疑问。是n还是n/2?我之所以写n/2,是因为我只在数组的一半上执行heapsort,但我不确定这是否正确。问题是关于运行时间,但它是否应该询问时间复杂性

由于提到了递归,这是一个关于自顶向下合并排序(与自底向上合并排序相反)的问题

对于按描述编写的代码,由于堆排序不是递归的,所以递归只发生在每个拆分子数组中的一个上。将调用Heap sort对大小为n/2、n/4、n/8、n/16等的子数组进行排序,在递归拆分的结果是大小为1的两个子数组之前,不会进行合并。在数组大小为2的幂的简单情况下,“合并排序”仅用于单个元素,大小为{1,2,4,8,…,n/8,n/4,n/2}的其余子数组按堆排序,然后合并


由于堆排序比合并排序慢,因此运行时间将更长,但时间复杂度仍为O(n log(n)),因为时间复杂度忽略了常量或较低的项因子。

问题询问运行时间,但它是否应该询问时间复杂度

由于提到了递归,这是一个关于自顶向下合并排序(与自底向上合并排序相反)的问题

对于按描述编写的代码,由于堆排序不是递归的,所以递归只发生在每个拆分子数组中的一个上。将调用Heap sort对大小为n/2、n/4、n/8、n/16等的子数组进行排序,在递归拆分的结果是大小为1的两个子数组之前,不会进行合并。在数组大小为2的幂的简单情况下,“合并排序”仅用于单个元素,大小为{1,2,4,8,…,n/8,n/4,n/2}的其余子数组按堆排序,然后合并


由于堆排序比合并排序慢,因此运行时间将更长,但时间复杂度保持在O(n log(n)),因为时间复杂度忽略了常量或较低的项因子。

让我们计算出在这种情况下的递归关系应该是什么。这里,我们是

  • 将阵列一分为二
  • 递归排序一半(T(n/2))
  • 堆插入一半(O(n log n)),然后
  • 将两半合并在一起(O(n))
这给了我们这个递归关系:

T(n)=T(n/2)+O(n对数n)

为什么这是O(n log n)而不是O((n/2)log(n/2))?原因是big-O表示法吞噬常数因子,因此O(n logn)表示与O((n/2)log(n/2))相同的渐近增长率。为什么t(n/2)上没有系数2?这是因为我们只进行了一次递归调用;记住,另一个调用被heapsort替换


现在要做的就是解决这个问题。它的结果确实是O(n logn),我将让您决定如何显示它。迭代法在这里是一个很好的选择。

让我们计算出在这种情况下,递归关系应该是什么。这里,我们是

  • 将阵列一分为二
  • 递归排序一半(T(n/2))
  • 堆插入一半(O(n log n)),然后
  • 将两半合并在一起(O(n))
这给了我们这个递归关系:

T(n)=T(n/2)+O(n对数n)

为什么这是O(n log n)而不是O((n/2)log(n/2))?原因是big-O表示法吞噬常数因子,因此O(n logn)表示与O((n/2)log(n/2))相同的渐近增长率。为什么t(n/2)上没有系数2?这是因为我们只进行了一次递归调用;记住,另一个调用被heapsort替换


现在要做的就是解决这个问题。它的结果确实是O(n logn),我将让您决定如何显示它。迭代法在这里是一个很好的选择。

好的!谢谢因此,总体时间复杂度为O(nlog)?@yoyou_24-由于堆和合并都具有时间复杂度O(n log(n)),因此这两者的任何组合也将具有时间复杂度O(n log(n)),尽管运行时间会有所不同,因为常量和低阶项会被大的时间复杂度O忽略。好的!谢谢因此,总体时间复杂度为O(nlog)?@yoyou_24-由于heap和merge都具有时间复杂度O(n log(n)),因此两者的任何组合也将具有时间复杂度O(n log(n)),尽管运行时间会有所不同,因为常量和低阶项被大的时间复杂度O忽略。非常感谢!这非常有帮助。只是一个问题:为什么不考虑合并贡献在复发?非常感谢!这非常有帮助。只是一个问题:为什么不考虑合并贡献在复发?