我想出了这个代码,它在升序列表中有两个 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
答案 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 。