【问题标题】:Efficient algorithm to print sum of elements at all possible subsequences of length 2 to n+1 [duplicate]打印长度为2到n + 1的所有可能子序列的元素总和的有效算法
【发布时间】:2015-10-07 06:52:16
【问题描述】:

我将从一个例子开始。假设我们有一个大小为 3 的数组,其中包含元素 abc,例如:(其中 abc 是一些数值)

|1 | 2| 3|
|a |乙| c|

(如上例所示,假设索引从 1 开始)

现在所有可能增加的长度为 2 的子序列是:

12 23 13

所以需要这些索引处元素的乘积之和,即ab+bc+ac

对于长度 3,我们只有一个递增的子序列,即 123,因此应该打印 abc
对于长度 4,我们没有序列,因此打印了 0 并且程序终止。

所以给定数组的输出将是:

ab+bc+ac,abc,0

例如,如果元素 abc 分别为 1、2 和 3,则输出应为 11,6,0

同样,对于一个大小为 4 且包含元素 a、b、c、d 的数组,输出将是:

ab+ac+ad+bc+bd+cd,abc+abd+acd+bcd,abcd,0

等等……

现在显然蛮力对于较大的数组大小值来说效率太低了。我想知道是否有一种有效的算法来计算给定大小的数组的输出?

编辑 1: 我尝试找到一种模式。例如对于大小为 4 的数组:

The first value we need is :(ab+ac+bc)+d(a+b+c)= ab+ac+ad+bc+bd+cd (Take A=ab+ac+bd) then the second value we need is:(abc) +d(A) = abc+abd+acd+bcd(B=abc) then the third value we need is : (0) +d(B) = abcd(Let's take 0 as C) then the fourth value we need is: +d(C) = 0

但它仍然需要大量计算,我想不出一种有效的方法来实现它。

编辑 2:我的问题与 this 不同,因为:

  1. 我不需要所有可能的排列。我需要从长度 2 到 n+1 的所有可能增加的子序列。
  2. 我也不需要打印所有可能的此类序列,我只需要由此获得的值(如上所述),因此我正在寻找一些数学概念或/和一些动态规划有效解决此问题的方法。
  3. 注意,我正在根据索引值查找所有可能的此类递增子序列的集合,然后根据上述索引位置处的值进行计算。

【问题讨论】:

  • 我们可以假设输入数组总是按升序排序吗?
  • @TimBiegeleisen 请检查编辑。
  • 子序列一个排列。你基本上是在做r选择N,其中N是数组的长度。
  • 其中N从2到N不等。所以r首先选择2,然后r选择3 ....直到r选择N对于所有这些,我们需要按照问题中的说明打印由此获得的值。
  • @TimBiegeleisen 另外,数组是否排序并不重要,因为索引总是会被排序。

标签: arrays algorithm math discrete-mathematics subsequence


【解决方案1】:

作为似乎已经消失的帖子指出,一种方法是获得重复关系。令 S(n,k) 为由序列索引的数组元素的乘积的长度为 k 的递增子序列(1..n)的总和。这样的子序列要么以 n 结尾,要么不以 n 结尾;在第一种情况下,它是长度为 k-1 的 1..n-1 和 {n} 的子序列的串联;在第二种情况下,它是长度为 k 的 1..n-1 的子序列。因此:

S(n,k) = S(n-1,k) + A[n] * S(n-1,k-1)

为了使这始终有意义,我们需要添加:

S(n,0) = 1
S(n,m) = 0 for m>n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2015-02-03
    • 1970-01-01
    • 2014-12-25
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多