使用递归查找所有可能的子集对

时间:2014-01-16 23:20:56

标签: c++ algorithm recursion

我得到了

struct point
{
    int x;
    int y;
};

和点表:

point tab[MAX];

程序应该从tab返回任何可能的子集对的重心之间的最小距离。子集可以是任何大小(当然> = 1且

所以我的函数将是int类型,因为我必须返回int。 我全局设置变量min(因为在进行递归时我必须将这些值与此min进行比较)

int min = 0;

我的功能应该是肯定的,取我添加的元素数量,Y坐标和X坐标之和。

int return_min_distance(int sY, int sX, int number, bool iftaken[])

我将很高兴得到进一步的帮助。 我想到了另一个bool表,我将其作为参数传递,以确定我是否从表中获取值。我的问题仍然是如何实现这一点,我不知道如何开始。

1 个答案:

答案 0 :(得分:1)

我认为你需要一个可以遍历表的所有子集的函数,从无任何东西或现有的迭代器开始。然后代码变得简单:

int min_distance = MAXINT;
SubsetIterator si1(0, tab);
while (si1.hasNext())
{
    SubsetIterator si2(&si1, tab);

    while (si2.hasNext())
    {
        int d = subsetDistance(tab, si1.subset(), si2.subset());

        if (d < min_distance)
        {
            min_distance = d;
        }
    }
}

SubsetIterators可以是简单的base-2数,能够计数到MAX,其中1位表示子集中的成员资格。是的,它是一个O(N ^ 2)算法,但我认为它必须是。

诀窍是结合递归。对不起,我只是看不出它有什么帮助。如果我能想出使用它的方法,我会编辑我的答案。

更新:我想到了更多,虽然我仍然看不到递归的用途,但我找到了一种方法来简化子集处理。 SubsetIterators可以存储x和y值的预先计算总和,而不是遍历整个表格进行每次距离计算,以便于进行距离计算。然后,在每次迭代时,您减去离开子集的值并添加要加入的值。一个简单的位和操作可以揭示这些。为了更高效,您可以使用gray coding而不是两个补码来存储成员资格位图。这将保证在每次迭代时恰好一个值进入和/或离开子集。最小的工作。

相关问题