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这正是我要找的。