Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
C匹配算法(使用递归和置换)_C_Algorithm_Recursion_Matching - Fatal编程技术网

C匹配算法(使用递归和置换)

C匹配算法(使用递归和置换),c,algorithm,recursion,matching,C,Algorithm,Recursion,Matching,我发现很多关于我的作业主题的研究接近我想要的,但并不确切。似乎许多赋值都是被迫寻找字符串的排列,这有着类似的方法。我是递归的新手,因此很难跟踪代码。我在另一篇文章中发现了这个片段: void swap(char* str, int i, int j) { char temp = str[i]; str[i] = str[j]; str[j] = temp; } void permute(char *string, int start, int end) { if

我发现很多关于我的作业主题的研究接近我想要的,但并不确切。似乎许多赋值都是被迫寻找字符串的排列,这有着类似的方法。我是递归的新手,因此很难跟踪代码。我在另一篇文章中发现了这个片段:

void swap(char* str, int i, int j)
{
    char temp = str[i];
    str[i] = str[j];
    str[j] = temp;
}

void permute(char *string, int start, int end)
{
    if(start == end)
   {
        printf("%s\n", string);
        return;
    }

    permute(string, start + 1, end);
    int i;
    for(i = start + 1; i < end; i++)
    {
        if(string[start] == string[i])
            continue;
        swap(string, start, i);
        permute(string, start + 1, end);
        swap(string, start, i);
    }
}
等等。我知道最终的排列数将是(n)!其中n是夫妻的数量。因此,10名男子和10名女子将是(10)!解决。考虑到这一点,我发现的代码是否与我应该寻找的代码相似,或者是否需要对其进行修改?我相信必须修改,因为这是排列一个线性数组,我的情况可以是排列两个独立的数组


你们怎么看?

你们不需要排列两个独立的数组-你们只需要排列其中一个,在匹配时保持另一个不变。这足以保证您检查所有可能的解决方案,以匹配男性和女性。证明很简单,
男性
只是女性的索引,而女性数组的所有排列都只是在寻找所有方法对其进行排序,即为女性分配索引的所有可能性

让我们看一个3男3女的简单例子:

data = [M1,M2,M3] [W1,W2,W3]
opt1: M1+W1, M2+W2, M3+W3
opt2: M1+W1, M2+W3, M3+W2
opt3: M1+W2, M2+W1, M3+W3
opt4: M1+W2, M2+W3, M3+W1
opt5: M1+W3, M2+W1, M3+W2
opt6: M1+W3, M2+W2, M3+W1
很容易看出这些都是可能的,我们只排列了women数组(
[W1,W2,W3]
),而men数组保持原样


编辑:
根据您已有的代码,可以做以下几件事:

int permute(int men[], int women[], int start, int end)
{
    if(start == end)
   {
        int i =0, sum = 0;
        for (i = 0; i < end; i++) sum += score(men[i],women[i]);
        return sum;
    }
    best = -INFINITY;
    best = max(permute(men, women, start + 1, end), best);
    int i;
    for(i = start + 1; i < end; i++)
    {
        if(women[start] == women[i])
            continue;
        swap(string, start, i);
        best = max(permute(men, women, start + 1, end), best);
        swap(women, start, i);
    }
    return best;
}
int-permute(int-men[],int-women[],int-start,int-end)
{
如果(开始==结束)
{
int i=0,sum=0;
对于(i=0;i
以上仅对女性进行排序,并在stop子句中检查分数(假设int)并返回迭代中找到的“最佳”分数(假设这里的最佳分数最高)。
我还假设您有一些函数
intscore(int,int)
,用于查找每个匹配的分数


注意:这是一个c风格的伪代码,未经测试,可能存在一些语法问题。

您不需要排列两个单独的数组-您只需排列其中一个数组,并在匹配时保持另一个不变。这足以保证您检查所有可能的解决方案,以匹配男性和女性。证明很简单,
男性
只是女性的索引,而女性数组的所有排列都只是在寻找所有方法对其进行排序,即为女性分配索引的所有可能性

让我们看一个3男3女的简单例子:

data = [M1,M2,M3] [W1,W2,W3]
opt1: M1+W1, M2+W2, M3+W3
opt2: M1+W1, M2+W3, M3+W2
opt3: M1+W2, M2+W1, M3+W3
opt4: M1+W2, M2+W3, M3+W1
opt5: M1+W3, M2+W1, M3+W2
opt6: M1+W3, M2+W2, M3+W1
很容易看出这些都是可能的,我们只排列了women数组(
[W1,W2,W3]
),而men数组保持原样


编辑:
根据您已有的代码,可以做以下几件事:

int permute(int men[], int women[], int start, int end)
{
    if(start == end)
   {
        int i =0, sum = 0;
        for (i = 0; i < end; i++) sum += score(men[i],women[i]);
        return sum;
    }
    best = -INFINITY;
    best = max(permute(men, women, start + 1, end), best);
    int i;
    for(i = start + 1; i < end; i++)
    {
        if(women[start] == women[i])
            continue;
        swap(string, start, i);
        best = max(permute(men, women, start + 1, end), best);
        swap(women, start, i);
    }
    return best;
}
int-permute(int-men[],int-women[],int-start,int-end)
{
如果(开始==结束)
{
int i=0,sum=0;
对于(i=0;i
以上仅对女性进行排序,并在stop子句中检查分数(假设int)并返回迭代中找到的“最佳”分数(假设这里的最佳分数最高)。
我还假设您有一些函数
intscore(int,int)
,用于查找每个匹配的分数


注意:这是一个c风格的伪代码,未经测试,可能存在一些语法问题。

这看起来不错!然而,我认为我的教授正在寻找一种递归方法,但这看起来像是线性的?你能把这一半的内容再详细说明一下吗?那么我会对每个男人的女人数组运行一个递归函数吗?所以一些伪代码看起来像:1。声明数组。2.对于人数组大小的循环。3.对于数组中的每个男性[i=0;i++],排列女性。然而,我不明白我怎么能说我已经选择了M1和W1,现在M2要么得到W2,要么得到W3,但我不知道如何解释这两个。你明白我在说什么吗?@dsiebert424看看编辑,它可以递归地完成,你可以检查基本clauseThanks@amit中每个排列的分数。这正是我要找的。这看起来不错!然而,我认为我的教授正在寻找一种递归方法,但这看起来像是线性的?你能把这一半的内容再详细说明一下吗?那么我会对每个男人的女人数组运行一个递归函数吗?所以一些伪代码看起来像:1。声明数组。2.对于人数组大小的循环。3.对于数组中的每个男性[i=0;i++],排列女性。然而,我不明白我怎么能说我已经选择了M1和W1,现在M2要么得到W2,要么得到W3,但我不知道如何解释这两个。你明白我在说什么吗?@dsiebert424看看编辑,它可以递归地完成,你可以检查基本子句中每个排列的分数@amit这正是我要找的。