不相交集的链表表示 - 算法简介文本中的遗漏?

时间:2010-06-27 22:17:51

标签: linked-list union flood-fill clrs

my last CLRS question,取得了成功,这是另一个:

Introduction to Algorithms,第二版,p。 501-502,描述了不相交集的链表表示,其中每个列表成员维护以下三个字段:

  • 设置会员
  • 指向next对象
  • 的指针
  • 指向第一个对象(集合representative)。

虽然链接列表可以通过仅使用单个“链接”对象类型来实现,但教科书显示辅助“链接列表”对象,该对象包含指向“头部”链接和“尾部”链接的指针。具有指向“尾部”的指针有助于Union(x, y)操作,因此不需要遍历更大集合x中的所有链接,以便开始附加较小集合{{1}的链接对它来说。

但是,要获得对尾部链接的引用,似乎每个链接对象都需要维护第四个字段:对Linked List辅助对象本身的引用。在这种情况下,为什么不完全删除Linked List对象并使用第四个字段直接指向尾部?

你会认为这是文中的遗漏吗?

2 个答案:

答案 0 :(得分:0)

我刚刚打开文本,教科书的描述对我来说似乎很好。

据我所知,数据结构类似于:

struct Set {
    LinkedListObject * head;
    LinkedListObject * tail;
};

struct LinkedListObject {
    Value set_member;
    Set *representative;
    LinkedListObject * next;
};

教科书没有谈到我所拥有的书(第二版)中的任何“辅助”链表结构。你能发表相关的段落吗?

做一个联盟会是这样的:

// No error checks.
Set * Union(Set *x, Set *y) {

    x->tail->next = y->head;    
    x->tail = y->tail;

    LinkedListObject *tmp = y->head;

    while (tmp) {

        tmp->representative = x;
        tmp = tmp->next;

    }
    return x;
}

答案 1 :(得分:0)

why not drop the Linked List object entirely and use that fourth field to point directly to the tail?

可以从路径压缩中获取洞察力。所有元素都应该指向列表的头部。如果没有发生,则find-set操作会这样做(通过改变p [x]并返回)。你跟尾巴说话一样。因此,如果只实现了这样的功能,那么我们可以使用它。