Algorithm 如何搜索每对符合条件的最大子集?
我希望这不是一个统计问题 假设我有一个接口:Algorithm 如何搜索每对符合条件的最大子集?,algorithm,search,subset,Algorithm,Search,Subset,我希望这不是一个统计问题 假设我有一个接口: public interface PairValidatable<T> { public boolean isValidWith(T); } 如上所述迭代将得到一个只包含元素0的子集,但元素1、2和4的子集是一个更大的子集,其中每对都通过了验证。然后,算法应返回存储在元素1、2和4中的点。虽然元素3和4彼此有效,元素1和4彼此有效,但元素2和3不有效,元素1和3也不有效。包含1、2和4的子集比3和4的子集大 我猜一些树或图算法最
public interface PairValidatable<T>
{
public boolean isValidWith(T);
}
如上所述迭代将得到一个只包含元素0的子集,但元素1、2和4的子集是一个更大的子集,其中每对都通过了验证。然后,算法应返回存储在元素1、2和4中的点。虽然元素3和4彼此有效,元素1和4彼此有效,但元素2和3不有效,元素1和3也不有效。包含1、2和4的子集比3和4的子集大
我猜一些树或图算法最适合解决这个问题,但我不知道如何设置它
解决方案不必是特定于Java的,最好可以用任何语言实现,而不是依赖Java内置。出于熟悉的原因,我只是在上面使用了类似Java的伪代码。推测
isValidWith
是可交换的——也就是说,如果x.isValidWith(y)
那么y.isValidWith(x)
。如果您只知道这些,那么您有一个实例,它被称为NP完全:
算法设计手册第6.2.3条和第8.5.1条中的“集团和独立集”和“集团”。纽约:Springer Verlag,第144页和312-314页,1997年
因此,如果你想要一个有效的算法,你必须希望你的特定的isValidWith
函数有更多的结构而不仅仅是交换性,你必须利用这种结构
对于您的具体问题,您应该能够执行以下操作:
每个操作都可以在O(n*log(n))时间内执行,因此您的特定问题是可以有效解决的。假定
isValidWith
是可交换的——也就是说,如果x.isValidWith(y)
那么y.isValidWith(x)
。如果您只知道这些,那么您有一个实例,它被称为NP完全:
算法设计手册第6.2.3条和第8.5.1条中的“集团和独立集”和“集团”。纽约:Springer Verlag,第144页和312-314页,1997年
因此,如果你想要一个有效的算法,你必须希望你的特定的isValidWith
函数有更多的结构而不仅仅是交换性,你必须利用这种结构
对于您的具体问题,您应该能够执行以下操作:
每个操作都可以在O(n*log(n))时间内执行,因此您的特定问题可以有效地解决。您是否想对数组中的每个条目运行相同的算法,并在对照所有其他条目进行检查时返回最成功的isValidWidth?@Stephan不太清楚。子集中的每一对都应该从isValidWith返回true。例如,a可能对b有效,b可能对c有效,但c可能对a无效。这意味着a或c必须被省略。我不确定我的示例方法是否会有这样的行为,但解决方案应该包括这样的方法。您能否将问题扩展到示例中包含3个以上的条目,以及您期望的输出是什么?将其绘制出来,看起来您正在寻找边具有非负斜率的元素的最大子集。这听起来准确吗?@Stephan这是一个很好的观察结果,尽管我认为你的意思是说非正斜率。这可能会使解决该问题变得更容易。您是否想对数组中的每个条目运行相同的算法,并在对所有其他条目进行检查时返回最成功的isValidWidth返回值?@Stephan不太清楚。子集中的每一对都应该从isValidWith返回true。例如,a可能对b有效,b可能对c有效,但c可能对a无效。这意味着a或c必须被省略。我不确定我的示例方法是否会有这样的行为,但解决方案应该包括这样的方法。您能否将问题扩展到示例中包含3个以上的条目,以及您期望的输出是什么?将其绘制出来,看起来您正在寻找边具有非负斜率的元素的最大子集。这听起来准确吗?@Stephan这是一个很好的观察结果,尽管我认为你的意思是说非正斜率。这会使解决这个问题变得更容易。因此,我想我会设置一个图,其中每个顶点表示一个数组元素,边连接通过isValidWith的对。@Devsman我在回答中添加了一个部分,讨论您的特定
isValidWith
函数。因此,我想我会设置一个图,其中每个顶点表示一个数组元素和边连接通过isValidWith的对?@Devsman我在回答中添加了一个部分,讨论您特定的isValidWith
函数。
public class Point implements PairValidatable<Point>
{
int x;
int y;
public Point(int xIn, int yIn)
{
x = xIn;
y = yIn;
}
public boolean isValidWith(Point other)
{
//whichever has the greater x must have the lesser (or equal) y
return x > other.x != y > other.y;
}
}
Point[] arr = new Point[5];
arr[0] = new Point(1000, 1000);
arr[1] = new Point(10, 10);
arr[2] = new Point(15, 7);
arr[3] = new Point(3, 6);
arr[4] = new Point(18, 6);