C语言 求稳定婚姻问题的所有旋转的算法实现

w1e3prcc  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(99)

我们正在尝试实现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

2w2cym1i

2w2cym1i1#

我们设法让它工作起来。在实现的逻辑中有一些错误,一个矩阵像矢量一样被访问。
同样,我们试图找到所有旋转的前辈的方法也不起作用。我们实现了该算法来构建同一篇论文中稍后提出的图-由于论文中的算法存在错误,因此进行了一些修正。
如果你想看代码,你可以找到它in this repository。当我写它的时候,它仍然是错误的,但是算法本身应该是正确的。

相关问题