划分和征服算法来计算朋友点数

时间:2017-03-21 08:37:09

标签: algorithm

我有一个需要通过分而治之来解决的问题。 有一组S包括N点。 如果有一个平行于轴的正方形,则只包含S中的两个点p1和p2,然后我们将p1和p2称为朋友点。

现在,我需要使用Divide和conquer算法计算S中有多少朋友点。

我想了很久。我没有办法。 我需要你的帮助。 我的英语不好,如果你有问题,请问我,我会加。 Thansks。

2 个答案:

答案 0 :(得分:1)

伪代码中的以下(不一定是最优)算法怎么样?

List<Pair<Point, Point>> findFriends(List<Point> points)
{
    List<Pair<Point, Point>> friends = new List<Pair<Point, Point>>();

    if (points.Count > 1)
    {
        if (points.Count == 2)
        {
           friends.Add(new Pair<Point, Point>(points[0], points[1]);
        }
        else
        {
           int xMedian = getMedianX(points);
           int yMedian = getMedianY(points);
           List<Point> topLeftPoints = selectPoints(points, 0, xMedian-1, yMedian, yMax);
           List<Point> bottomLeftPoints = selectPoints(points, 0, xMedian-1, 0, yMedian-1);
           List<Point> topRightPoints = selectPoints(points, xMedian, xMax, yMedian, yMax);
           List<Point> bottomRightPoints = selectPoints(points, xMedian, xMax, yMedian, yMax);

           friends.Add(findFriends(topLeftPoints));
           friends.Add(findFriends(bottomLeftPoints));
           friends.Add(findFriends(topRightPoints));
           friends.Add(findFriends(bottomRightPoints));      
        }
    }

    return friends;
}

答案 1 :(得分:0)

诀窍是以这样的方式划分,使得各个部分更小并且可以独立处理。我们可以使用类似于快速排序的枢轴将点分成两组。但它比听起来更困难,因为如果没有正确完成,这些集合可能不会因特殊情况而缩小或不是独立的。

添加好友:由于无法进一步划分,必须进行评估的集合的大小为1(无所事事),2(添加对)和3(添加2到3)配对,需要检查)。

寻找支点:计算平均值x和平均值y并找到最接近它的点p

除以:将点分为4组a,b,c和d,如下所示。 a,b是左下角,右上角分区和c,da左上角,右下角分区,只保留更好的分区(如果a.size + b.size&lt; = c.size + d.size,则取a,b )。这应该确保即使在特殊情况下,最大的undevidable集合的大小也是3(我不是100%肯定的,但如果它应该更大,算法保持不变,只是添加朋友的更多基本情况)。所有集合包括枢轴和其他点,如下所示:设置a:x&lt; = p.x || y&lt; p.y,设置b:x&gt; p.x || y&gt; = p.y,设置c:x&lt; p.x || y&gt; = p.y并设置d:x&gt; = p.x || y&lt; p.y.我们最终应该得到两组,它们都占总分数的1/2到3/4,可以独立处理。因此,使用此算法,可以不止一次检测到一对朋友。

示例:

* * *    * * *    * * .   * * *
* * * => * p * => * * . , . * * bottom-left top-right partition
* * *    * * *    * * *   . * *

* * .    * * .    * * .   . . .
* * . => * p . => * * . , * * . top-left bottom-right partition
* * *    * * *    * . .   * * *

. . .    . . .    . . .   . . .
* * . => * * . => * . . , . * * bottom-left top-right partition
* * *    * p *    * * *   . * .

依此类推......简化:

a | b    top-left bottom-right partition: 1st set: a, b, c, p; 2nd set: b, c, d, p.
- p -
c | d    bottom-left top-right partition: 1st set: a, c, d, p; 2nd set: a, b, d, p.

这些群体是独立的,因为广告和广告管理系统中的点不能成为朋友,p将始终挡在路上。左上角的右下方分区从d分离点a,左下角的右上角分区从c分离出b点。