在my last CLRS question,取得了成功,这是另一个:
在Introduction to Algorithms,第二版,p。 501-502,描述了不相交集的链表表示,其中每个列表成员维护以下三个字段:
next
对象representative
)。虽然链接列表可以通过仅使用单个“链接”对象类型来实现,但教科书显示辅助“链接列表”对象,该对象包含指向“头部”链接和“尾部”链接的指针。具有指向“尾部”的指针有助于Union(x, y)
操作,因此不需要遍历更大集合x
中的所有链接,以便开始附加较小集合{{1}的链接对它来说。
但是,要获得对尾部链接的引用,似乎每个链接对象都需要维护第四个字段:对Linked List辅助对象本身的引用。在这种情况下,为什么不完全删除Linked List对象并使用第四个字段直接指向尾部?
你会认为这是文中的遗漏吗?
答案 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]并返回)。你跟尾巴说话一样。因此,如果只实现了这样的功能,那么我们可以使用它。