这是针对遗传算法的适应度函数,因此我可以尽可能高效地执行此操作,因为它会一遍又一遍地重复。
假设有一个函数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(),查找它们的好坏,并计算它们的长度。唯一的问题是我们不想计算“好”子阵列的“好”子阵列,但有“好”子阵列可能从另一个好的子阵列开始,但在它之外结束。
我们想要所有“好”数组的长度计数,而不是“好”数组的子数组。此外,如上所述,“好”数组可能从另一个“好”数组的中间开始,但两者的组合可能是“坏”数组。
答案 0 :(得分:2)
您需要一个递归算法,将结果保存到某些外部数据结构中。
它应该将子阵列的开始和结束索引作为参数,检查它是否良好。
如果数组良好,则其start
和end
索引应存储在该外部结构中。否则,您应该进行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);
}
}
}