【发布时间】:2018-05-16 19:39:37
【问题描述】:
我有 round(n/k) 个排序的子列表,这意味着每个子列表的长度是 k(以及一个长度小于 k 的单个列表)。我需要使用经典的 O(m+n) 合并函数将它们合并到单个 n 长度的排序列表中,因此需要 O(n*log(n/k))。
我有两个实现,一个带有递归(这似乎是正确的,但除非我改变递归深度,否则我不能这样做,而且我不明白为什么实际上,当输入列表的子列表不超过 10 个,每个子列表的长度为 k=3):
def merge_sorted_blocks(lst):
i=0
pairs_lst=[]
n=len(lst)
while i<n-1:
pairs_lst.append(merge(lst[i],lst[i+1]))
i+=2
if n%2>0:
pairs_lst.append(lst[n-1])
if type(pairs_lst[0])!=list:
return pairs_lst
return merge_sorted_blocks(pairs_lst)
一个连续的输出列表和下一个子列表:
def merge_sorted_blocks(lst):
pairs_lst=[]
for i in lst:
pairs_lst=merge(pairs_lst,i)
return pairs_lst
但我不认为它具有所需的复杂性,更像是 O(n*(k+2k+...))=O(n^2))。 我发现这个线程表明它确实如此,但我不明白如何: https://math.stackexchange.com/questions/881599/on-log-k-for-merging-of-k-lists-with-total-of-n-elements
关于这些解决方案,我有什么遗漏吗?
【问题讨论】:
-
请修正你的缩进。
-
你读过堆数据结构吗? (这里是最小堆)
标签: python algorithm sorting time-complexity