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

标签 java android sorting arraylist time-complexity

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

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

First one is to sort Arraylist B and then have two index positions one for Arraylist A and other for Araylist B, then we will move index one by one to insert B list's item in A.

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

复杂度的顺序为 O(m Log(m))(用于对 ArrayList B 进行排序)+ O(n + m)

Second Approach is just have an index on ArrayListaylist B and then use Binary search to place item from Arraylist B to A.

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

现在谁能告诉我我应该选择哪种方法,如果您能想到比这两种方法更好的其他方法,请提及。

最佳答案

这取决于nm的相对大小。

n > m*log(m) 第一个算法的运行时间复杂度为 O(m*Log(m) + max(n,m)) 将由 n 上的线性项支配(注意在这种情况下 max(n,m)=nn > m*log(m)).在这种情况下,复杂度 O(log(n) * m) 的第二种算法会更好。

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

编辑:以上部分错误

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

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

关于java - 第一个列表已排序,另一个未排序,这是合并两个列表的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47111502/

相关文章:

android - Fragment 和 DialogFragment 生命周期关系

检查给定矩形是否形成正方形的算法

java - 基于索引,随机访问和顺序访问之间的区别?

C# dll 引用产生 classnotfound 异常

android - 从Android应用程序上传YouTube视频

安卓NDK : Could not find application project directory?

java - 我可以从递归返回到 main 而不展开堆栈吗?

java - 在请求字符串中发送印地文字符时获取垃圾值

java - 选择排序未正确排序 - 或根本没有排序

python - 自定义排序列表,了解一些项目的顺序