第一个列表是排序的,另一个是未排序的,这是合并两个列表的更好方法

时间:2017-11-04 13:55:38

标签: java android sorting arraylist time-complexity

我有一个Sorted ArrayList A和一个未排序的ArrayList B,现在我想在A中合并B的项目,以便A保持排序。

现在我只能想到两种方法。

  

第一个是对Arraylist B进行排序,然后有两个索引位置,一个用于Arraylist A,另一个用于Araylist B,那么我们将移动索引   一个接一个地在A中插入B列表的项目。

我们假设Arraylist A的大小为n,Arraylist B的大小为m

复杂性顺序为O(m Log(m))(用于排序ArrayList B)+ O(n + m)

  

第二种方法只是在ArrayListaylist B上有一个索引,然后使用Binary search将项目从Arraylist B放到A.

复杂性顺序为O(Log(n) * m)

现在任何人都可以告诉我应该选择哪种方法,如果你能想到比这两种更好的方法,请提及。

2 个答案:

答案 0 :(得分:1)

取决于nm的相对大小。

n > m*log(m) O(m*Log(m) + max(n,m))复杂n的第一个算法的运行时间将由max(n,m)=n上的线性项主导(在此方案中注意n为{{1} }}> m*log(m))。在这种情况下,复杂度为O(log(n) * m)的第二个算法会更好。

确切的实际截止点将取决于每种算法特定实现的常数因子,但原则上,随着n相对于m变大,第二种算法变得更好,并最终成为更好的选择。换句话说,对于m的每个可能值,n存在足够大的值,第二个算法更好。

编辑:以上是错误的

我回答假设这两种算法的复杂性,但现在我不确定第二种算法的复杂性是否正确。您建议使用二进制搜索将未排序列表中的每个数字插入到排序列表中,但您究竟会如何执行此操作?如果您有链接列表,则无法进行二进制搜索。如果你有一个数组,你需要在每个插入上替换部分数组,这是每个插入的线性开销。我不确定是否有办法通过更复杂的数据结构来实现这一点,但是你不能用链表或数组来做到这一点。

澄清一下,如果你有两个具有时间复杂度的算法,那么我的原始答案就成立了,但你的第二个算法并没有我们假设的O(m log(n))复杂度。

答案 1 :(得分:1)

  

第一种方法:m * log(n)= O(mlgn)

     

第二种方法:m * log(m)+ n + m = O(mlgm)

if n <= m {
   1st approach
} else {
   2nd approach
}