问题如下: 有k个排序长度为n / k的列表(我们假设k除以n)。 我需要找到一个算法,将这些列表合并为一个长度为n的列表 运行时间复杂度为O(k + nlogk)。
我在考虑合并夫妻名单, 而不是由夫妇再次合并合并列表,依此类推,当我到达一个长度为n的排序列表时,我会停止。
当我计算算法的时间复杂度时,我得到了O(nlogk),这比所需时间更重要。
我想知道我的方式是不是错了。 谢谢你的帮助!
答案 0 :(得分:1)
你的方式很好。
当给出k <= n且k> = 1时,则O(n log k)= O(k + n log k)。这两个都隐含在“我们假设k除以n”的陈述中,所以你的结果就是他们应该的结果。
如果我们放松这些条件,那么我们必须考虑k> n的情况,其中一些k列表为空。然后你必须担心合并所有空列表所花费的时间,并且你的算法需要O(k + n log k)时间。
答案 1 :(得分:1)
很容易看出O(nlogk)是O(k + nlogk),因为@MattTimernans提到的k <= n。使用堆很容易得到O(k + nlogk)。首先,我们构建每个列表的所有第一个元素的堆,它取O(k)。然后,我们弹出一个元素并将一个新元素推回到堆中。继续做N次,我们将通过合并O(k + nlogk)中的所有列表来获得排序列表
答案 2 :(得分:0)
据我了解,可以实现
的运行时间O(k^2*(n/k)) = O(kn)
通过以下想法。假设列表按非递减顺序排序。迭代直到所有列表都为空。在每次迭代中,使用k
步骤确定第一个元素相对于列表的所有第一个元素的最小值。从列表中删除元素并将其附加到结果。