并查集

并查集

引入:

有6个小球。

命令

  1、把1和2所在的集合合并。

  2、把2和3所在的集合合并。

  3、把3和4所在的集合合并。

  ……

  5、   把5和6所在的集合合并。

  按照以前的想法,可能会更改下标,把1的下标改为2。

执行命令1、

2、

......

5、

  这样虽然能够达到目的,但是,时间复杂度为o(n),每一次把小球拿出来,又放进去……

 

  我们又想,那能不能把个数小集合的合并到个数大的集合那边呢。

 

  这叫做启发式排序:把小的拿到大的。虽然看上去好像也没省多少时间…(⊙_⊙;) 但事实上,省了很多时间,时间复杂度变成了n log n。(⊙o⊙)目瞪口呆

 

  不过呢,这还不是最省时间的方案哦,老大登场:并查集。[铛铛铛]

 

  其实所谓的并查集,就是找祖宗ancestor,一路深搜下去,看自己的祖先是谁,当然,祖先的祖先就是自己啦。再返回。

 

  虽然每一次都一路深搜下去,会很慢,所以就要用到“路径压缩”,在退回来的同时,把自己的根节点变为祖先。这样子就省了“前辈”的时间啦。

但是,别忘了一开始所有节点的祖先都是自己。

 

posted @ 2017-08-19 18:49  yiyiyizqy  阅读(101)  评论(0编辑  收藏  举报