Java算法“乘以”两个列表((A),(B))*((C,C),(D,D))==((A,C,C),(A,D,D) ),(B,C,C),(B,d,d))

时间:2014-01-08 18:35:33

标签: java algorithm list time-complexity path-combine

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

List<List<E>> pathList1
List<List<E>> pathList2

当然天真的解决方案:

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);
   }
}

无关的理论问题

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

让N = numList列在pathList1

设M = pathList2中的num列表

设X = pathList1中路径的平均长度

设Y = pathList2中路径的平均长度

所以如果问“这个功能的复杂性是多少?”我会给予

~O(NM(X + Y))

我想知道是否有更快的方法来做到这一点?

也许是更好的数据结构?

同时进行吗?

制作某种“未来”的种类并将其归还? (完全披露,我对未来97%无知)。

我愿意接受聪明的技巧和独特的解决方案,或者纯粹是实用的。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以查看guava 尤其是Sets#cartesianProduct

即。你可以做这类事情:

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

答案 1 :(得分:0)

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

如果您有以下路径列表“(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)时间内执行。

另外,对于Big-O表示法,我们通常不关心单个变量,只关注问题复杂性的整体规模。它通常纯粹是作为单个变量n的函数编写的,n是元素的数量。

但是如果你想“加倍”两个列表,一个元素与另一个元素相对应,那么它将是O(n ^ 2)并且实际上并没有更快的方式。