集合合并
百度面試題:將多個集合合并成沒有交集的集合
2010-03-20 18:25
給定一個字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求將其中交集不為空的集合合并,要求合并完成后的集合之間無交集,例如上例應輸出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。
(1)請描述你解決這個問題的思路;
(2)請給出主要的處理流程,算法,以及算法的復雜度
(3)請描述可能的改進。
解決方案:
采用hash的方法,key為字符串,value為一個鏈表,存儲集合編號。
算法思想:
用一個數組來存儲集合合并關系,如果有N個集合,則用a[N]來存儲,元素初始化為-1.
首先,將集合從左往右進行編號:0,1,2,。。。
然后,逐個遍歷集合中的字符串,采用hash方法進行映射:先將該集合添加到對應鏈表中;然后,數組中該集合對應元素如果為-1,則改為鏈表中最小集合編號,如果不為-1,則不作修改,如果A[n]中的元素已經被修改了(更新哈希桶,或者用已經更新的A覆蓋),繼續讀取下一個字符串,重復該操作。
?
例如:
{a},{c},{a, b}, {c, d}
分析過程如下:
首先分別編號為0,1,2,3
先讀入字符串a:
a 0?[0, -1, -1, -1] // 集合0對應元素原來為-1,故寫入編號0
c 1 [0, 1, -1, -1]
a 0,2 [0,1,0,-1] //集合2對應元素原來為-1,故寫入該鏈表中最小編號0
b 2 [0,1,0,-1] //集合2對應元素不為-1,故不做修改
c 1,3 [0,1,0,1]
d 3 [0,1,0,1]
由此,可知0,2為同一集合,1,3為一個集合。
總結