Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何搜索每对符合条件的最大子集?_Algorithm_Search_Subset - Fatal编程技术网

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
函数有更多的结构而不仅仅是交换性,你必须利用这种结构

对于您的具体问题,您应该能够执行以下操作:

  • 按x坐标的递增顺序对点进行排序
  • 在排序列表中查找y坐标的位置

  • 每个操作都可以在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
    函数有更多的结构而不仅仅是交换性,你必须利用这种结构

    对于您的具体问题,您应该能够执行以下操作:

  • 按x坐标的递增顺序对点进行排序
  • 在排序列表中查找y坐标的位置

  • 每个操作都可以在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);