我有两个列表列表,子列表代表路径。我想找到所有路径。
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%无知)。
我愿意接受聪明的技巧和独特的解决方案,或者纯粹是实用的。
感谢。
答案 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)并且实际上并没有更快的方式。