查找数组的所有子数组的所有元素的乘积
Posted
技术标签:
【中文标题】查找数组的所有子数组的所有元素的乘积【英文标题】:Finding product of all elements of all sub arrays of an array 【发布时间】:2016-01-08 04:15:48 【问题描述】:我有一个包含 n 个元素的数组 A。我想找出数组 A 的所有可能子数组中所有元素的乘法。我期待在 DP 的帮助下实现该解决方案。我想将所有产品值存储在数组 B 中。我是编程的初学者。我已经做了很多谷歌搜索,但我无法找到我的查询的确切解决方案。任何人都可以帮我提供问题的逻辑。 示例:
A=1,2,3
所有可能的子数组都是
1,2,3,1,2,1,3,2,3,1,2,3
所以所有可能的产品都是
1,2,3,2,3,6,6
分别。
任何帮助都是可观的。提前致谢。
【问题讨论】:
@YoungHobbit 实际上我不知道如何为大 n 解决这个问题,但我在谷歌上搜索并发现了一些我不理解的链接 你应该考虑使用正确的词:子序列而不是子数组。子数组是数组的连续部分。 【参考方案1】:这可能会有所帮助:
在每种情况下,您都必须做出两个选择:
要么选择当前子数组中的数组元素,要么不选择。以下递归可能会有所帮助:
f(i,p)=f(i+1,p*arr[i])||f(i+1,p)
【讨论】:
【参考方案2】:你可能知道如何创建一个数组的所有子数组,所以,这让问题变得简单:
如果您的array(a)
中有n
元素并且其中一个元素是m
,那么为了计算您的问题,您可以使用这个:
MySubArray(a , n) =
new array MySubArray(a - m , n - 1) , MySubArray(a - m , n - 1) * m;
这意味着您一次计算a - m
的所有子数组的问题,另一次,您将m
添加到所有子数组中,然后将它们的乘积与m
相乘。
【讨论】:
【参考方案3】:M 大小的集合有N = 2^M-1
子集(包括空集),因此每个子集都对应于0..N-1
范围内的数字。如果第 k 位设置为某个数字,则第 k 个元素出现在相应的子集中。
动态编程方法允许重用计算的产品,因此复杂度与输出大小成线性关系 O(N) = O(2^M) 德尔福代码:
var
A, Prods: TArray<Integer>;
iA, i, SeriesLen, N: Integer;
s: String;
begin
A := TArray<Integer>.Create(2, 3, 5, 7);
N := 1 shl Length(A); //output array size = 2^InputLength
SetLength(Prods, N);
Prods[0] := 1;
SeriesLen := 1;
for iA := 0 to Length(A) - 1 do begin
for i := 0 to SeriesLen - 1 do
Prods[i + SeriesLen] := Prods[i] * A[iA];
SeriesLen := SeriesLen * 2;
end;
output Prods[1]..Prods[N-1]
Result: 2 3 6 5 10 15 30 7 14 21 42 35 70 105 210
【讨论】:
【参考方案4】:您自己尝试的提示是这样的。 考虑到我们在一个数组中有 N 个元素的事实。这些元素可能是唯一的,也可能不是唯一的。然后我们创建一个二进制数字列表/数组来映射所有可能的子数组(尽管根据您的疑问,正确的术语应该是子序列)。
For example :
here N = 4.
Array : 1 2 3 2
The possible sub sequences would be
Binary Encoding (1 to include, 0 to exclude) :
0 0 0 0 : # No use for us in this case
0 0 0 1 : 2
0 0 1 0 : 3
0 0 1 1 : 3, 2
0 1 0 0 : 2
0 1 0 1 : 2,2
0 1 1 0 : 2,3
0 1 1 1 : 2,3,2
1 0 0 0 : 1
1 0 0 1 : 1,2
1 0 1 0 : 1,3
1 0 1 1 : 1,3,2
1 1 0 0 : 1,2
1 1 0 1 : 1,2,2
1 1 1 0 : 1,2,3
1 1 1 1 : 1,2,3,2
Thus you can generate all the sub sequences for a given array. and find their product.
【讨论】:
以上是关于查找数组的所有子数组的所有元素的乘积的主要内容,如果未能解决你的问题,请参考以下文章
从一道算法面试题看我国信息科技的原创性不足:查找包含所有元素的最短子数组