《算法导论》第21章 用于不相交集合的数据结构 个人笔记

来源:互联网 发布:罗慕路斯 知乎 编辑:程序博客网 时间:2024/05/22 02:08

第21章 用于不相交集合的数据结构

21.1 不相交集合的操作

用一个对象表示一个集合的每个元素,设x表示一个对象,希望支持以下三个操作:

  • MAKE-SET(x):建立一个新的集合,它的唯一成员(因而为代表)是x。因为各个集合是不相交的,故x不会出现在别的某个集合中。
  • UNION(x,y):将包含x和y的两个动态集合(表示为Sx,Sy)合并成一个新的集合,即这两个集合的并集。
  • FIND-SET(x):返回一个指针,这个指针指向包含x的(唯一)集合的代表。

不相交集合数据结构的许多应用之一是确定无向图的连通分量。下面伪代码中,图G的顶点集用G.V表示,边集用G.E表示

CONNECTED-COMPONENTS(G){    for each vextex v in G.V        MAKE-SET(v)    for each edge(u,v) in G.E        if FIND-SET(u) != FIND-SET(v)            UNION(u,v)}SAME-COMPONENT(u,v){    if FIND-SET(u) == FIND-SET(v)        return TRUE    else        return FALSE}

21.2 不相交集合的链表表示

每个集合用一个自己的链表来表示。每个集合的对象包含head属性和tail属性,head属性指向表的第一个对象,tail属性指向表的最后一个对象。链表中的每个对象都包括一个集合成员、一个指向链表中下一个对象的指针和一个指回到集合对象的指针。

21.3 不相交集合森林

MAKE-SET(v){    x.p = x    x.rank = 0}UNION(u,v){    LINK(FIND-SET(u),== FIND-SET(v))}LINK(x,y){    if x.rank > y.rank        y.p = x    else        x.p = y        if x.rank == y.rank            y.rank++}FIND-SET(x){    if x != x.p        x.p = FIND-SET(x.p)    return x.p}
阅读全文
0 0
原创粉丝点击