java - 合并两个数组列表的最快方法

标签 java merge

我正在尝试按排序顺序合并两个列表,我想知道合并它们的最快方法是什么。 目前,我的算法基本上是(忽略语法):

merge(a, b){
    newlist = new Arraylist()
    while(!a.isEmpty() && !b.isEmpty()){
        if(a.get(0) > b.get(0))
            newlist.add(a.remove(0))
        else 
            newlist.add(b.remove(0))
    }
    newlist.addAll(a)
    newlist.addAll(b)
    return newlist
}

有没有更快的方法来进行这种合并?我正在尝试尽可能减少我的运行时间,因为这个函数被调用了数千次非常大的 ArrayLists。

最佳答案

ArrayList 的前面移除具有 O(N) 时间复杂度,因为所有其他元素都需要移动。相反,您可以存储两个 List 的当前索引,并每次比较索引处的元素以合并 O(N) 总体时间复杂度(利用两个 List 都已经排序的事实)。请注意,这通常是合并排序中使用的方法。此外,如果您知道最后的大小,最好将初始容量传递给 ArrayList 构造函数。

public static List<Integer> merge(List<Integer> a, List<Integer> b){
    List<Integer> result = new ArrayList<>(a.size() + b.size());
    int left = 0, right = 0;
    while(left < a.size() || right < b.size()){
        if(right == b.size() || left < a.size() && a.get(left) <= b.get(right)){
            result.add(a.get(left++));
        } else {
            result.add(b.get(right++));
        }
    }
    return result;
}

关于java - 合并两个数组列表的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67049173/

相关文章:

java - 当我尝试使用 Selenium RC 单击“提交”按钮进入下一页时,30000 毫秒后超时

java - 如何为 Joda 的 DateTime.parse() 设置默认时区

java - 升级到 spring 5.0.7.RELEASE 导致 parseStringValue 出现问题

Android list 合并 - 来自库项目的不同启动器 Activity

java - 将函数作为静态类传递以实现 Java 中的快速数字

r - 在R中非常大的数据集中,将2列多次组合成1列

version-control - 是否有任何可以理解代码的源代码控制合并工具?

python - 合并两个不完全匹配时间戳的 pandas 数据帧

Java 合并两个排序列表导致超出内存限制。我的和正确的有什么区别?

java - 为什么内部类的 this$0 字段不是私有(private)的?