Java算法到";乘;两份名单((A)、(B))*((C,C)、(D,D))==((A,C,C)、(A,D,D)、(B,C,C)、(B,D,D))

Java算法到";乘;两份名单((A)、(B))*((C,C)、(D,D))==((A,C,C)、(A,D,D)、(B,C,C)、(B,D,D)),java,algorithm,list,time-complexity,path-combine,Java,Algorithm,List,Time Complexity,Path Combine,我有两个列表列表,子列表表示路径。我想找到所有的路径 List<List<E>> pathList1 List<List<E>> pathList2 列表路径列表1 列表路径列表2 当然,最简单的解决方案是: List<List<E>> result = new ArrayList<List<E>>(); for(List<E> p1 : pathList1) { for(Li

我有两个列表列表,子列表表示路径。我想找到所有的路径

List<List<E>> pathList1
List<List<E>> pathList2
列表路径列表1
列表路径列表2
当然,最简单的解决方案是:

List<List<E>> result = new ArrayList<List<E>>();

for(List<E> p1 : pathList1) {
   for(List<E> p2: pathList2) {
      List<E> newList = new ArrayList<E>(p1.size()+p2.size());
      newList.addAll(p1);
      newList.addAll(p2);
      result.add(newList);
   }
}
List result=new ArrayList();
对于(列表p1:pathList1){
对于(列表p2:pathList2){
List newList=newarraylist(p1.size()+p2.size());
newList.addAll(p1);
newList.addAll(p2);
结果。添加(新列表);
}
}

无关理论问题

我最近了解了时间复杂性。因此,这是一个自我检查,我希望有人可以评论,如果我是正确的

设N=pathList1中的num列表

让M=pathList2中的num列表

设X=路径列表1中路径的平均长度

设Y=路径列表2中路径的平均长度

如果问到“这个函数的复杂性是什么?”我会给出

~O(纳米(X+Y))

我想知道有没有更快的方法

也许是更好的数据结构

同时做吗

做一些“未来”之类的东西,然后返回它?(充分披露,我对未来97%一无所知)

我乐于接受巧妙的技巧和独特的解决方案,或者纯粹的实用方法


谢谢

我对你的确切目标感到困惑

如果您有以下路径列表“(A,B,C)(D,E)”和“(C,D)(A,B)”

然后您当前的代码将返回

(A、B、C、C、D)、(D、E、C、D)、(A、B、C、A、B)、(D、E、A、B)

这就是你想要的吗?这不是所有的路径,这是所有路径的组合

将显示所有路径的列表

(A、B、C)(D、E)(C、D)(A、B)

这可以在简单的O(N)时间内完成

同样,对于大O表示法,我们通常不关心单个变量,只关心问题复杂性的总体规模。它通常被写成一个单一变量n的函数,n是元素的数量

但是如果你想将两个列表“相乘”,一个列表中的每个元素与另一个元素相乘,那么它将是O(n^2),没有更快的方法了。

你可以看看 特别是对

i、 e.你可以做这样的事情:

Sets.cartesianProduct(ImmutableList.of(
       ImmutableSet.of(Sets.newHashSet(pathList1)),
       ImmutableSet.of(Sets.newHashSet(pathList2)))

我认为你的方法和打印结果所花费的时间是一样的,这是最优的,所以我认为你不能在边界上改进我很抱歉,所有的组合我指的是列表一中的每一条路径和列表二中的每一条路径。这仍然让人困惑。你看过我的帖子了吗?所以,你们是说你们只是想在一个和两个路径中列出一个路径列表,还是说你们想将每个路径组合起来?说清楚!你认为这样会更快吗?我追求的是速度,而不是易用性。但我一定会去图书馆看看,谢谢@user498001在我与这个库的所有交互过程中,它被证明是非常健壮的(尽管我没有特别使用这个方法)@user498001
Guava项目包含几个谷歌的核心库
,为了互联网的缘故,我希望它很快!