数据结构

  1. 并查集

 x下标代表元素 s[x]代表他的父节点。 s[x]为-1的时候 为根节点。

期初把所有的元素 分为独立的树,s[0],s[1],...,s[n]

然后坐Union合并 有关系的两个元素  合并 两个元素  是找到两个元素的根节点 然后把两颗树的根节点进行合并。优化:小树根合大树下。防止出现只有一个节点的单链表。这样合并所有元素的时间复杂度就变成了n方。现在为nlogn

void union(int x, int y){
  int[x] = y;  
}

所以找到元素的根元素的函数为  节点元素直接指向他的根节点元素

void find(x){
if(s[x] == -1)
  return x;  
}else{
  return s[x] = find(s[x]);
}

最后这个构成的一个两层高度的关系图(树)。(不需要具体的连同细节,只关心两个元素是否有关系的查找效率。)

posted @ 2018-12-18 11:39  saveworld_niub  阅读(144)  评论(0编辑  收藏  举报