从数组中计算可行的子列表长度

时间:2010-04-01 17:07:25

标签: java arrays algorithm

这是针对遗传算法的适应度函数,因此我可以尽可能高效地执行此操作,因为它会一遍又一遍地重复。

假设有一个函数foo(int [] array),如果数组是“好”数组则返回true,如果数组是“坏”数组则返回false。这里的好坏并不重要。这不是我们在这里定义的功能。它只是依赖于我试图找出的函数。

给定完整的数组[1,6,8,9,5,11,45,16,9],让我们说子数组[1,6,8]是一个由foo()定义的“好”数组[9,5,11,45]是foo()定义的“好”数组。此外,[5,11,45,16,9]是一个“好”阵列,也是最长的“好”子阵列。请注意,虽然[9,5,11,45]是一个“好”数组,而[5,11,45,16,9]是一个“好”数组,[9,5,11,45,16,9 ]是一个“坏”阵列。

注意它不是我们定义的foo()函数。我们所关心的是我们采用完整数组的所有可能的子数组,将它们发送到foo(),查找它们的好坏,并计算它们的长度。唯一的问题是我们不想计算“好”子阵列的“好”子阵列,但有“好”子阵列可能从另一个好的子阵列开始,但在它之外结束。

我们想要所有“好”数组的长度计数,而不是“好”数组的子数组。此外,如上所述,“好”数组可能从另一个“好”数组的中间开始,但两者的组合可能是“坏”数组。

1 个答案:

答案 0 :(得分:2)

您需要一个递归算法,将结果保存到某些外部数据结构中。

它应该将子阵列的开始和结束索引作为参数,检查它是否良好。

如果数组良好,则其startend索引应存储在该外部结构中。否则,您应该进行2次递归调用:从start索引到end-1索引,从start+1索引到end索引。

public void getLargestGoodArrays (int start, int end) {
   if (isGood (start, end) {
      saveGoodArray (start, end);
   } else {
      //here you should iterate through all already found good arrays to check whether the array with larger bounds already saved
      if (!isSubarrayOfGoodArray (start, end - 1)) {
         getLargestGoodArrays (start, end - 1);
      }
      if (!isSubarrayOfGoodArray (start + 1, end)) {
         getLargestGoodArrays (start + 1, end);
      }          
   }
}