倒排序的应用实例一


  给定一个字符串的集合,格式如:{aaabbbccc},{bbbddd},{eeefff},{ggg},{dddhhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaabbbcccdddhhh},{eeefff},{ggg}。
  (1)请描述你解决这个问题的思路;
  (2)请给出主要的处理流程,算法,以及算法的复杂度
  (3)请描述可能的改进。
回答:
  集合使用hash_set来表示,这样合并时间复杂度比较低。
  1、给每个集合编号为0,1,2,3...
  2、创建一个hash_map,key为字符串,value为一个链表,链表节点为字符串所在集合的编号。遍历所有的集合,将字符串和对应的集合编号插入到hash_map中去。
  3、创建一个长度等于集合个数的int数组,表示集合间的合并关系。例如,下标为5的元素值为3,表示将下标为5的集合合并到下标为3的集合中去。开始时将所有值都初始化为-1,表示集合间没有互相合并。在集合合并的过程中,我们将所有的字符串都合并到编号较小的集合中去。
   遍历第二步中生成的hash_map,对于每个value中的链表,首先找到最小的集合编号(有些集合已经被合并过,需要顺着合并关系数组找到合并后的集合编号),然后将链表中所有编号的集合都合并到编号最小的集合中(通过更改合并关系数组)。
  4、现在合并关系数组中值为-1的集合即为最终的集合,它的元素来源于所有直接或间接指向它的集合。
  算法的复杂度为O(n),其中n为所有集合中的元素个数。
  题目中的例子:
  0:{aaabbbccc}
  1:{bbbddd}
  2:{eeefff}
  3:{ggg}
  4:{dddhhh}
  生成的hash_map,和处理完每个值后的合并关系数组分别为
  aaa:0。[-1,-1,-1,-1,-1]
  bbb:0,1。[-1,0,-1,-1,-1]
  ccc:0。[-1,0,-1,-1,-1]
  ddd:1,4。[-1,0,-1,-1,0]
  eee:2。[-1,0,-1,-1,0]
  fff:2。[-1,0,-1,-1,0]
  ggg:3。[-1,0,-1,-1,0]
  hhh:4。[-1,0,-1,-1,0]
  所以合并完后有三个集合,第0,1,4个集合合并到了一起,
  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值