这两个python代码有什么区别?

时间:2016-01-25 08:25:50

标签: python

我最近开始学习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;时间?

1 个答案:

答案 0 :(得分:4)

&#34;更长&#34;解决方案有更好asymptotic complexitysorted()O(n*log n),并且鉴于列表是有序的,手动合并为O(n),其中n = len(list1) + len(list2)

随着列表长度的增长,第二种算法的表现会更好:如果总长度增长两倍,则只需要两倍的时间。这大概是&#34;线性时间&#34;的意思。也就是说,考虑花一些时间阅读一般的复杂性,这对新手程序员来说可能是最好的时间投入。

更新:实际上,魔鬼在细节中。由于list.pop(0)O(n),后一种实施情况更糟。只是通过列表而不修改它们会更有意义。