这个Haskell合并代码的运行时间是多少

时间:2014-10-14 01:34:22

标签: performance algorithm haskell recursion

我想出了这个代码,它在升序列表中有两个 SORTED ,然后将这两个列表合并为一个列表,保留升序排序。我试图分析它,看看它的时间复杂性是什么。我的信念是,在最坏的情况下,我们将不得不遍历整个列表,因为有2个列表,我们必须有一个嵌套的复原,这意味着最坏情况下的O(n ^ 2)时间。但是,由于我们在递归之前比较了两个元素中每个元素的大小,我认为这可能是O(log n)时间。如果我错了,请纠正我。感谢

这是我的递归:

mergeLists::[Integer]->[Integer]->[Integer]
mergeLists [] []        =[]
mergeLists [] (y:ys)    =(y:ys)
mergeLists (x:xs) []    =(x:xs)

mergeLists (x:xs) (y:ys)
 |(x<y)                 =x:mergeLists xs (y:ys)
 |otherwise             =y:mergeLists (x:xs) ys

3 个答案:

答案 0 :(得分:2)

因为列出的已经排序..然后合并时间将是O(n),而n是两个列表的总大小。

它将像合并排序一样工作:http://www.vogella.com/tutorials/JavaAlgorithmsMergesort/article.html

答案 1 :(得分:2)

时间效率将为O(n),因为假设两个列表已经按升序排列。您不需要递归或执行比较的任何部分,而不是传递给函数的每个列表中的元素数量。

Ach,Kareem已经回答了这个问题。通过提供对时间和空间效率的Big-O表示法的理解,我会做得更好。 Big-O表示法用于表示任意大小的数据集上的算法性能的基本概念。很明显,随着算法数据集的增加,执行操作的实际时间也会增加。如果线性确定时间的增加(IE每个数据成员增加算法实际完成的时间与所有其他元素相同),那么算法的时间效率在订单上被称为&#34; n&#34;或O(n)。您的算法就属于这种情况。

要了解有关Big-O表示法的更多信息,请阅读StackOverflow上的另一个问题:What does O(log n) mean exactly?

答案 2 :(得分:1)

您的mergeLists O(n + m),其中 n m 是输入列表的长度。通过对 n + m 的数学归纳可以很容易地证明递归调用的数量最多为 n + m

  • 对于前3个案例,没有递归,因此递归调用的数量通常小于 n + m
  • 对于最后两种情况:在每种情况下,嵌套调用接收一个原始列表,另一个缩短为1.所以我们可以使用归纳原理告诉我们嵌套调用最多会使 n + m-1 递归调用,因此有问题的调用最多会进行 n + m 次调用。