亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

不相交集合ADT

2019-11-14 17:43:43
字體:
來源:轉載
供稿:網友

不相交集合數據結構保持一組不相交的動態集合S={S1,S2,...,SK},每個集合通過一個代表來識別,代表即集合中的某個成員。

如果x表示一個對象,不相交集合支持以下操作:

MAKE-SET(x):建立一個新的集合,其唯一成員為x。因為各集合是不想交的,故x沒有在其它集合中出現。

UNION(x,y):將包含x和包含y的集合合并為一個新的集合。

FIND-SET(x):返回包含x的集合。

1.不相交集合的數組表示

在一個數組中保存每個元素所在集合的名稱。這樣Find操作就是簡單的O(1)查找。要執行Union(x,y)操作,假設x在等價類i中,y在等價類j中,

掃描整個數組,將所有的i變為j。連續N-1次Union操作就要花費Θ(N2)的時間。如果Union操作很多,這個界是不可接受的。

2.不相交集合的鏈表表示

每一個集合用用一個鏈表來表示。鏈表的第一個對象作為它所在集合的代表。鏈表中每個對象都包含一個集合成員,一個指向下一個對象的指針,

以及指向代表的指針。每個鏈表含head和tail指針,head指向鏈表的代表,tail指向鏈表中最后的對象。

 

Union的簡單實現:將x所在的鏈表拼接到y所在鏈表的表尾。對于原先x所在鏈表中的每一個對象都要更新其指向代表的指針。

平均看來,每個操作需要Θ(N)的時間。

加權合并:每個表含表的長度,總是將更短的表連接到長的表的后面。這樣,m和MAKE-SET,UNION和FIND-SET操作要花費(m+nlgn)的時間。 

class SetNode(object):    def __init__(self,key):        self.key=key        self.next=None        self.rep=Noneclass SetEntry(object):    def __init__(self):        self.head=None        self.tail=None        self.len=0class DisjSet(object):    def __init__(self,node):        self.setlist=[]    def make_set(self,node):        S=SetEntry()        S.head=node        S.tail=node        S.len=1        node.rep=node        self.setlist.append(S)    def find(self,node):        return node.rep    def union(self,node_x,node_y):        rep_x=node_x.rep        rep_y=node_y.rep        if rep_x!=rep_y:            for s in self.setlist:                if s.head==rep_x:                    set_x=s                elif s.head==rep_y:                    set_y=s            if set_x.len>=set_y.len:                set_x.tail.next=rep_y                node=rep_y                while node is not None:                    node.rep=rep_x                    node=node.next                set_x.tail=set_y.tail                set_x.len=set_x.len+set_y.len                self.setlist.remove(set_y)                return rep_x            else:                set_y.tail.next=rep_x                node=rep_x                while node is not None:                    node.rep=rep_y                    node=node.next                set_y.tail=set_x.tail                set_y.len+=set_x.len                self.setlist.remove(set_x)                return rep_y

 3.不相交集合森林

使用樹來表示一個集合,樹的根用來作為集合的代表。樹的每個節點都含有元素的數據以及一個指向父節點的指針。根節點的指針為空。

可以用數組來非顯式的來表示樹:數組的每個成員T[i]表示元素i的父節點,如果i是根,取p[i]為0或者-1。

如果任意執行Union操作,樹可能會變為退化樹,有幾種方法可以避免這種情況

3.1 靈巧求并算法

總是讓更小的樹成為較大的樹的子樹,稱為按大小求并。另一種方法是按高度求并。

這樣的話,任何節點的深度都不會超過logN,Find操作的運行時間是O(logN),而連續M次操作則花費O(MlogN)。

實現時,讓數組每個元素包含它的樹的大小的負值。

class DisjSet(object):    def __init__(self,size):        self.list=[-1]*size    def find(self,x):        if self.list[x]<0:            return x        else:            return self.find(self.list[x])    def union(self,x,y):        set_x=self.find(x)        set_y=self.find(y)        if set_x!=set_y:            if self.list[set_x]>self.list[set_y]:                self.list[set_y]+=self.list[set_x]                self.list[set_x]=set_y                return set_y            else:                self.list[set_x]+=self.list[set_y]                self.list[set_y]=set_x                return set_x

3.2 路徑壓縮

路徑壓縮在一次Find(X)操作期間執行,從X到根的路徑上的每一個節點都使它的父節點變成根。

路徑壓縮與按大小求并是完全兼容的,而不完全與按高度求并兼容。路徑壓縮時每棵樹的高度會發生變化,可以對每棵樹所存儲的高度估計,用秩rank表示。

class DisjSet_with_rank(object):    def __init__(self,size):        self.list=[-1]*size    def find(self,x):        if self.list[x]<0:            return x        else:            self.list[x]=self.find(self.list[x])            return self.list[x]    def union(self,x,y):        set_x=self.find(x)        set_y=self.find(y)        if set_x!=set_y:            if self.list[set_x]<self.list[set_y]:                self.list[set_y]=set_x            else:                if self.list[set_x]==self.list[set_y]:                    self.list[set_y]-=1                self.list[set_x]=set_y

路徑壓縮的顯式表示  

class SetNode(object):    def __init__(self,key):        self.parent=None        self.key=key        self.rank=1def find(node):    if node.parent is None:        return node    else:        node.parent=find(node.parent)        return node.parentdef union(x,y):    x=find(x)    y=find(y)    if x!=y:        if x.rank<=y.rank:            if x.rank==y.rank:                y.rank+=1            x.parent=y            return y        else:            y.parent=x            return x        

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91香蕉嫩草影院入口| 韩曰欧美视频免费观看| 亚洲成人黄色在线观看| 日韩欧美在线网址| 国产亚洲a∨片在线观看| 欧美激情高清视频| 精品少妇v888av| 欧美日韩综合视频| 久久精品亚洲国产| 国产欧美在线观看| 自拍偷拍亚洲在线| 欧美激情一区二区三级高清视频| 亚洲精品日韩在线| 欧美日韩免费在线| 亚洲激情在线观看视频免费| xxav国产精品美女主播| 日韩大陆毛片av| 91成人天堂久久成人| 国产精品美女视频网站| 久久99久久99精品中文字幕| 亚洲成人网av| 欧美激情亚洲一区| 欧美美女18p| 日韩中文字幕网址| 最好看的2019的中文字幕视频| 久久综合久中文字幕青草| 国语自产精品视频在免费| 国产精品视频久久久久| 国产日本欧美视频| 色妞色视频一区二区三区四区| 日韩av123| 国产精品免费在线免费| 亚洲国产高潮在线观看| 国内偷自视频区视频综合| 日韩电影在线观看永久视频免费网站| 欧美亚洲第一区| 国产亚洲精品一区二区| 日本久久久久久久| 日本国产一区二区三区| 国产精品中文久久久久久久| 91精品国产高清久久久久久| 亚洲最大福利网站| 日韩大胆人体377p| 亚洲综合小说区| 精品成人国产在线观看男人呻吟| 日韩天堂在线视频| 国产精品福利在线| 国产精品久久久久久久久借妻| 国产亚洲精品一区二555| 欧美乱大交xxxxx| 亚洲精品成人av| 日韩中文字幕视频在线观看| 欧美性生交大片免费| 亚洲一区二区三区在线免费观看| 国产精品极品美女粉嫩高清在线| 奇门遁甲1982国语版免费观看高清| 欧美日韩免费区域视频在线观看| 亚洲成人三级在线| 成人字幕网zmw| 中文欧美在线视频| 久久久久久久久久久免费精品| 成人免费观看网址| 国产精品久久久久久久久久三级| 一区二区三区国产视频| 91亚洲国产成人精品性色| 国产精品jvid在线观看蜜臀| 国外成人在线视频| 国产日韩中文在线| 免费91麻豆精品国产自产在线观看| 欧美老少配视频| 国产成人精品午夜| 国产成人精品国内自产拍免费看| 色综合久久久888| 欧美国产激情18| 视频一区视频二区国产精品| 日本一区二三区好的精华液| 亚洲综合中文字幕在线观看| 日韩视频免费大全中文字幕| 欧美不卡视频一区发布| 色七七影院综合| 欧美在线性视频| 国产91在线高潮白浆在线观看| 欧美激情videoshd| 国产精品入口日韩视频大尺度| 亚洲高清久久久久久| 亚洲欧洲高清在线| 久久91亚洲精品中文字幕| 2019中文字幕在线观看| 久久国产精品视频| 精品福利视频导航| 久久资源免费视频| 久久久女人电视剧免费播放下载| 精品国产网站地址| 亚洲国产成人爱av在线播放| 国产精品嫩草影院一区二区| 国产成人精品优优av| 日本亚洲欧美成人| 日韩精品小视频| 久久精品99久久久久久久久| 欧美极度另类性三渗透| 日产精品久久久一区二区福利| 中文字幕久热精品在线视频| 中文在线资源观看视频网站免费不卡| 久久综合九色九九| 国产精品专区h在线观看| 欧美寡妇偷汉性猛交| 欧美中文在线免费| 日韩电视剧在线观看免费网站| 久久久久久久av| 国产精品极品美女粉嫩高清在线| 欧美精品免费看| 欧美成人免费在线视频| 成人黄色免费在线观看| 欧美巨大黑人极品精男| 久久精品免费电影| 亚洲人成网站色ww在线| 91精品国产自产91精品| 国产拍精品一二三| 亚洲男人av在线| 亚洲新中文字幕| 精品久久久久久| 欧美福利在线观看| 欧美做受高潮1| 国产一区二区激情| 亚洲第一免费网站| 国产精品嫩草影院久久久| 国产一区二区日韩| 亚洲少妇中文在线| 国产精品中文字幕久久久| 久久久av免费| 精品日韩美女的视频高清| 国产精品观看在线亚洲人成网| 国产精品99蜜臀久久不卡二区| 欧美激情综合色综合啪啪五月| 久久久久久久久久久成人| 国产精品久久一区主播| 九九热精品视频国产| 欧美视频不卡中文| 国产成人福利网站| 亚洲国产精品99| 国产精品视频26uuu| 一区二区三区在线播放欧美| 日韩影视在线观看| 久久人人爽人人爽人人片av高请| 2018日韩中文字幕| 精品中文字幕在线2019| 成人欧美一区二区三区在线湿哒哒| 日韩高清电影免费观看完整| 最近的2019中文字幕免费一页| 欧美性高潮在线| 国产精品一区二区久久久久| 亚洲精品日韩av| 国产成人精彩在线视频九色| 欧美综合在线第二页| 疯狂欧美牲乱大交777| 日韩有码视频在线| 亚洲va欧美va国产综合久久| 欧美成aaa人片在线观看蜜臀| 欧美丰满老妇厨房牲生活| 在线观看日韩欧美| 欧美激情亚洲精品| 国产专区欧美专区| 亚洲国产精品va在线看黑人动漫| 成人激情在线播放|