我遇到了这个问题,要求计算与mergeSort完全一样的算法的最坏情况运行时间,但是两个递归调用之一被Heapsort代替。
因此,我知道在mergesort中进行划分需要固定的时间,并且合并为O(n)。堆排序为O(nlogn)。 这是我想出的:T(n)= 2T(n / 2)+ O((n / 2)logn)+ O(n)。 我对O((n / 2)logn)部分有疑问。是n还是n / 2?我写了n / 2,因为我只对数组的一半做堆排序,但是我不确定那是正确的
答案 0 :(得分:0)
该问题询问运行时间,但是否应该询问时间复杂性?
由于提到了递归,所以这是关于自上而下的合并排序(而不是自下而上的合并排序)的问题。
使用如上所述编写的代码,由于堆排序不是递归的,因此递归仅发生在每个拆分子数组之一上。将调用堆排序对大小为n / 2,n / 4,n / 8,n / 16,...的子数组进行排序,并且直到大小为1的两个子数组成为结果时,才会进行合并递归拆分。在简单的情况下,如果数组大小是2的幂,那么“合并排序”仅用于单个元素,其余子数组的大小为{1,2,4,8,...,n / 8,n / 4,n / 2}通过堆排序进行排序,然后合并。
由于堆排序比合并排序慢,因此运行时间会更长,但是时间复杂度保持在O(n log(n)),因为时间复杂度会忽略常量或较低项因素。
答案 1 :(得分:0)
让我们弄清楚这种情况下的重复关系。在这里,我们
这给了我们这种重复关系:
T(n)= T(n / 2)+ O(n log n)。
为什么这个O(n log n)而不是O((n / 2)log(n / 2))?原因是big-O表示法会增加常数因子,因此O(n log n)表示与O((n / 2)log(n / 2))相同的渐近增长率。为什么在T(n / 2)上没有2的系数?这是因为我们只进行一次递归调用;请记住,另一个调用已由heapsort替换。
现在剩下要做的就是解决这种重复发生的情况。确实可以算出O(n log n),我将它留给您来决定如何显示。此处的迭代方法是一个不错的选择。