Java算法到 "multiply"两个列表列表((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

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

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

不相关的理论问题

我最近了解了时间复杂度。所以这是一个 self 检查,我希望有人能评论我是否正确。

让 N = num lists in pathList1

设 M = pathList2 中的 num 个列表

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

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

所以如果问“这个函数的复杂度是多少?”我愿意给

~O(NM(X + Y))

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

也许是更好的数据结构?

同时进行?

创造某种“ future ”并返回它? (完全披露,我 97% 对 future 一无所知)。

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

谢谢。

最佳答案

可以看看guava 特别是 Sets#cartesianProduct

即你可以做这样的事情:

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

关于Java算法到 "multiply"两个列表列表((A),(B))*((C,C),(D,D))==((A,C,C),(A,D,D), (B,C,C),(B,D,D)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21003822/

相关文章:

java - 读取 yaml 文件时发生 UnrecognizedPropertyException

python - 引用单维列表的python异常行为中的列表

c# - 获取具有最新值的对象的不同列表

java - GXT 3 使用 ListStore 显示集合的每个值一行

java - Spring MVC 与 FreeMarker : locale specific templates

java - 如何通过连接集合限制结果集

java - 汉诺塔解决方案问题

c++ - 在圆上找点

python - 如何在Python中的两个列表中找到所有唯一的组合?

python - 循环列表返回 dict 中的值