【问题标题】:Fastest way to Merge two arraylists合并两个数组列表的最快方法
【发布时间】:2021-07-06 23:46:30
【问题描述】:

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

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 非常大。

【问题讨论】:

    标签: java merge


    【解决方案1】:

    ArrayList 的前面移除具有O(N) 的时间复杂度,因为所有其他元素都需要移动。相反,您可以存储两个 Lists 的当前索引,并每次比较索引处的元素以合并 O(N) 整体时间复杂度(利用两个 Lists 已经排序的事实) .请注意,这通常是合并排序中使用的方法。另外,如果你知道最后的大小,最好将初始容量传递给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;
    }
    

    【讨论】:

      【解决方案2】:

      是否应该使用并行性进行快速相似的合并?

      public static List<Integer> merge(List<Integer> a, List<Integer> b) {
          return Stream.concat(a.parallelStream(), b.parallelStream())
              .sorted().collect(toList());
      }
      

      (我真的很感兴趣,速度优势是否证明所选解决方案的更高编程工作是合理的。)

      【讨论】:

        【解决方案3】:

        对于任何性能问题:您必须使用自己的数据进行衡量。

        在这种情况下:使用预期的大小初始化您的数组列表,这样就不需要调整它的大小。但这只是一个起点

        【讨论】:

          猜你喜欢
          • 2013-06-07
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2013-02-07
          相关资源
          最近更新 更多