我最近遇到了以下问题,到目前为止还没有找到解决方法。
设S = {v 1 ,v 2 ,v 3 ,...,v n }是在ℝ 6 上定义的一组n个数组。也就是说,每个阵列有6个条目。
对于给定的数组,让维度的平均值为对应于该集合中所有元素的维度的坐标之间的平均值。
另外,让我们将一组数组的某个属性 P 定义为集合的所有均值中的最低值(总共有6个均值,每个维度一个)。例如,如果某个集合具有{10,4,1,5,6,3}作为其维度的平均值,则此集合的 P 为1.
现在问题的定义:在所有子集S'之间返回最大基数。 S使得 P(S')≥T, T 已知的阈值,或者如果这样的子集不存在则为0。另外,输出任何最大的S' (这样 P(S')≥T)。
总结:输入:集合S和阈值T.输出:某个子集S' (| S' |显然是即时的)。
我第一次开始尝试提出一个贪婪的解决方案,但没有成功。然后,我转向动态编程方法,但无法建立解决问题的递归。我可以进一步扩展我对解决方案的看法,但考虑到我有多远(或者没有得到),我不认为它们会有多大用处。
非常感谢任何帮助!
答案 0 :(得分:0)
通过递归进行Bruteforce评估的时间复杂度为O(2 ^ n),因为每个数组都可以存在于子集中。
通过整数线性规划的帮助,解决这个问题的方法之一(效率仍然低但略胜一筹)。
Define Xi = { 1 if array Vi is present in the maximal subset, 0 otherwise }
Hence Cardinality k = summation(Xi) {i = 1 to n }
此外,由于所有维度的平均值> = T,这意味着:
d11X1 + d12X2 + ... + d1nXn >= T*k
d21X1 + d22X2 + ... + d2nXn >= T*k
d31X1 + d32X2 + ... + d3nXn >= T*k
d41X1 + d42X2 + ... + d4nXn >= T*k
d51X1 + d52X2 + ... + d5nXn >= T*k
d61X1 + d62X2 + ... + d6nXn >= T*k
Objective function: Maximize( k )
实际上你应该用基数方程来消除k,但为了清楚起见,我把它包含在这里。