我最近开始学习Python
我从https://developers.google.com/edu/python/exercises/basic
下载了一个基本练习档案我编写了以下练习的代码。
给定两个以递增顺序排序的列表,创建并返回合并 按排序顺序排列的所有元素的列表。您可以修改传入的列表。理想情况下,解决方案应该适用于"线性"时间,单打 通过两个名单。
我的代码是
def linear_merge(list1, list2):
result = sorted(list1 + list2)
return result
但是,提供的解决方案是
def linear_merge(list1, list2):
result = []
while len(list1) and len(list2):
if list1[0] < list2[0]:
result.append(list1.pop(0))
else:
result.append(list2.pop(0))
result.extend(list1)
result.extend(list2)
return result
我用我的代码运行了示例示例,并且工作正常。
但是,我不知道为什么解决方案比我的长。
两个代码之间是否存在实际差异? 我误解了这个问题吗?
P.S。另外,问题中最后一句话的含义是什么,即线性&#39;时间?
答案 0 :(得分:4)
&#34;更长&#34;解决方案有更好asymptotic complexity:sorted()
为O(n*log n)
,并且鉴于列表是有序的,手动合并为O(n)
,其中n = len(list1) + len(list2)
。
随着列表长度的增长,第二种算法的表现会更好:如果总长度增长两倍,则只需要两倍的时间。这大概是&#34;线性时间&#34;的意思。也就是说,考虑花一些时间阅读一般的复杂性,这对新手程序员来说可能是最好的时间投入。
更新:实际上,魔鬼在细节中。由于list.pop(0)
是O(n)
,后一种实施情况更糟。只是通过列表而不修改它们会更有意义。