说我有k个未排序列表,我想将它们合并到一个列表中,这样我就可以对它们运行排序算法,然后我需要将这个大合并列表分开以得到k个排序列表。如何跟踪哪个元素属于哪个列表,以便可以正确分离此合并列表?它需要在线性时间内完成
答案 0 :(得分:1)
假设我们有n
个元素
初始化:
为每个列表中的每个元素添加一个int
,说明它属于哪个列表。遍历所有O(n)
。
合并:
对于每个列表,请使其结尾并指向下一个列表的开头。总时间O(n)
。
断裂:
创建k
指针-新k lists
的开始。
遍历排序后的列表,并针对列表中的每个元素将其从新的k lists
复制到它表示属于的列表的末尾。
我们可以记住每个新列表的结尾,因此需要O(1)
才能到达那里。因此,总时间为O(n)
。
并将所有时间加在一起-O(n)
。
答案 1 :(得分:0)
在Python中使用字典,可以很容易地完成。
from collections import OrderedDict
a = [[9,2,5],[6,3,7],[1,8,4]] #3 unsorted lists with 3 elements in each.
key_dict = dict() # create a dictonary
for i in range(len(a)): # iterate over each nested-list
for val in a[i]: # iterate over each element of the nested list
key_dict[val] = i # each element in dict contains the index of the nested list
# it belongs to as a value, the key is the element itself
sorted_dict = OrderedDict(sorted(key_dict.items(), key=lambda x: x[0])) #sorting elements collectively
new_list = [[] for i in range(3)] # you can change it to number of nested lists present.
for k, v in sorted_dict.items():
new_list[v].append(k)
print(new_list) # Output : [[2, 5, 9], [3, 6, 7], [1, 4, 8]]
除了对元素进行排序之外,每个步骤都需要O(n)
时间来运行,这完全是您所期望的。