我们正在尝试实现Dan Gusfield在1987年的文章“Three Fast Algorithms for Four Problems in Stable Marriage”中第6页和第7页描述的算法(非常粗略),available here。
然而,我们的代码中有一些错误,我们无法找到问题的根源。理论上,breakmarriage应该永远不会失败并退出,因为我们已经知道必须打破的婚姻-但它确实失败了。breakmarriage的意外失败导致访问内存中的随机位置,导致程序崩溃。此外,有些示例找到了正确的旋转次数,但是没有前导的旋转比预期的要多。
下面是数据结构和过程的代码:
#include <stdlib.h>
struct ResultsList {
struct ResultsListElement* first;
struct ResultsListElement* last;
};
struct ResultsListElement {
char* value; //il matching
struct ResultsListElement* next;
};
struct RotationList { //list_el
char man;
char woman;
struct RotationList* next;
};
struct RotationNode {
struct RotationList* rotation;
int index;
int missing_predecessors;
struct SuccessorsList* successors;
};
struct SuccessorsList {
struct RotationNode* value;
struct SuccessorsList* next;
};
struct RotationsList { //free_rotations_list
struct RotationsListElement* first;
struct RotationsListElement* last;
};
struct RotationsListElement { //free_rotations_list
struct RotationNode* value;
struct RotationsListElement* next;
};
void appendResultsList(struct ResultsList* list, char* result){
struct ResultsListElement *new = malloc(sizeof (struct ResultsListElement));
new->value = result;
new->next = NULL;
if (list->first==NULL){
list->first = new;
list->last=new;
}else{
list->last->next = new;
list->last = new;
}
}
void appendRotationsList(struct RotationsList* list, struct RotationNode* rotation_node){
struct RotationsListElement *new = malloc(sizeof (struct RotationsListElement));
new->value = rotation_node;
new->next = NULL;
if (list->first==NULL){
list->first = new;
list->last=new;
}else{
list->last->next = new;
list->last = new;
}
}
个字符
请注意,许多参数的唯一目的是使代码更有效。
下面是导致问题的输入的一个示例,但是通过尝试随机(有效)输入,应该不难找到更多的示例。
2 0 1
0 1 2
1 0 2
2 0 1
0 1 2
1 2 0
型
1条答案
按热度按时间2w2cym1i1#
我们设法让它工作起来。在实现的逻辑中有一些错误,一个矩阵像矢量一样被访问。
同样,我们试图找到所有旋转的前辈的方法也不起作用。我们实现了该算法来构建同一篇论文中稍后提出的图-由于论文中的算法存在错误,因此进行了一些修正。
如果你想看代码,你可以找到它in this repository。当我写它的时候,它仍然是错误的,但是算法本身应该是正确的。