Algorithm 查找两个n长度数组的特殊顺序n长度组合
给定两个N长度数组,找出优先于B数组元素的这些数组的N长度组合 例如,给定数组Algorithm 查找两个n长度数组的特殊顺序n长度组合,algorithm,Algorithm,给定两个N长度数组,找出优先于B数组元素的这些数组的N长度组合 例如,给定数组A:[1,2,3]和B:[4,5,6] Fun(A,B)可以产生: [4,5,6]->包含来自B阵列的3个 [4,5,3]->包含来自B阵列的2个 [4,2,6]->包含来自B阵列的2个 [1,5,6]->包含来自B阵列的2个 [4,2,3]->包含来自B阵列的1个 [1,5,3]->包含来自B阵列的1个 [1,2,6]->包含来自B阵列的1个 最重要的是,在产生组合时,B数组中的大多数元素首先出现 另外,我更喜欢
A:[1,2,3]
和B:[4,5,6]
Fun(A,B)
可以产生:
[4,5,6]->包含来自B阵列的3个
[4,5,3]->包含来自B阵列的2个
[4,2,6]->包含来自B阵列的2个
[1,5,6]->包含来自B阵列的2个
[4,2,3]->包含来自B阵列的1个
[1,5,3]->包含来自B阵列的1个
[1,2,6]->包含来自B阵列的1个
最重要的是,在产生组合时,B数组中的大多数元素首先出现
另外,我更喜欢K的线性运行时解决方案,其中K是可以创建的组合数(
2^N
)。解决方案可以如下构造:
你可以在网上搜索组合数学的有效实现。如果需要,我可以提供一个简单的组合。有
2**N
组合(或者2**N-1
的组合忽略了a
中的所有元素),因此仅列出它们的运行时间远远不是N
要生成它们,请注意,每个组合对应于一个N
-位编号,0
表示“从A
中获取元素,1
表示“从B
中获取元素”。因此,生成所有N
-位数字,并根据popcount对它们进行排序
有可能直接以正确的顺序生成它们,并降低指数空间复杂度。步骤1:使用通用算法生成所有元素的组合步骤2:根据元素的出现情况排序是,我添加了一个编辑以选择线性运行时?作为什么的函数?还有,所有元素都应该是唯一的吗?当一个元素出现在两个数组中时会发生什么?我们可以假设所有元素都是唯一的,是的。感谢您的关注。:)这很接近,但是这个解决方案有一个bug:我在这里编码:@paul:bug是什么?从这个解决方案返回的第四个元素的结果是B数组中只有1个项目,而不是2个项目。这是因为算法的递归性质。我链接的要点显示了对该算法将返回什么的更详细分析。在找到组合后对它们进行排序对我来说不起作用。组合的数量太多了,我可能只关心前3-100个组合。