union find 并查集

一、数据的预处理

要找一个数是不是在数组中,不可能用遍历的方法实现,这样时间复杂度就超过O(n)了。而要降低时间复杂度,一个经典的方案就是空间换时间。用增加空间复杂度的方法来换取时间复杂度的降低。所以我们可以先对数组进行一次预处理,生成一份包含数组元素的哈希表。这样在求解某个数字在不在数组时就可以得到O(1)的时间复杂度。

二、union find 原理和优化

参考自:http://blog.csdn.net/dm_vincent/article/details/7655764

场景

(1) 连通图

主要思想

  • 怎么表示节点之间的联通关系?
    find :确定元素属于哪个子集、是否同一子集?
  • 如何将节点以更好的方式组织起来?可否牵一发动全身?
    union: 将两个元素合并成一个子集。

方案:

  1. 什么样子的数据结构能够将一些节点给组织起来?(链表,图,树……)
  2. 哪种结构对于查找和修改的效率最高?--> 树

Find:根据其父节点的引用向根行进直到到底树根。
Union:将两棵树合并到一起,这通过将一棵树的根连接到另一棵树的根。

  1. 可以不改变底层结构吗? --> parent link
    如果在不改变底层结构的情况下,即不改变使用数组的表示方法,可以使用 parent link模型,这样,合并两棵树的操作就是:
    id[pRoot] = qRoot或者是id[qRoot] = pRoot

优化方法:

1. weighted union(小树合并到大树)

但是,树这种数据结构容易出现极端情况,因为在建树的过程中,树的最终形态严重依赖于输入数据本身的性质,比如数据是否排序,是否随机分布等等。
比如在输入数据是有序的情况下,构造的BST会退化成一个链表。在我们这个问题中,也是会出现的极端情况的。
解决方法”:总是选择小树和大树合并,合并,即id[pRoot] = qRoot
所以需要一个另外的数组记该点所属的conpoment的大小。

2.压缩查询路径(树的扁平化)

另外的一个问题就是,在向上找根节点的时候,效率不高,
解决方法:在union操作中,在while里面,把 p->father 改成 p->grandpap

三、leetcode 上union find的题目

(1) leetcode 128

  • 题目
    [200 2 190 100 3 1 4] 找出里面连续的序列:[1, 2, 3, 4]
  • 思想:找出关系 --> 集合内部:(1,2) (2,3) (3,4)
  • 流程
    先用一个hashSet保存所有的 id : (100,4,200,1,3,2)
    先构造一个数组,放每个数字的朋友,一开始自己是自己的朋友:
    relation: [100, 4, 200, 1, 3, 2]
    然后依次判断一个 pair关系(100,99),(4,3),(200,199),(1,0),(3,2),(2,1)。
    过程如下:
    先判断(100,99): 在hashSet 里面找不到99, continue;
    然后判断(4,3):在hashSet里面可以找到3,所以把 relation 数组进行更新:变成 [100, 4, 200, 1, 4, 2]
    判断(200,199), 没有199,continue;
    判断(1,0),没有0,continue;
    判断(3,2),有2, relation 数组更新为 [100, 4, 200, 1, 4, 4 ]
    判断(2,1),有1, relation 数组更新为 [100, 4, 200, 4, 4, 4 ]
    所以可以判断有3个component

具体实现
1. 怎么记录size?
2. 如果某些数字特别大,怎么存放索引?

解决方法
HashMap

注意的细节
(1) 给出的数组可能会有重复
(2) 怎么表征“找不到”, 注意,数组中可能有负数
(3) HashMap 的更新要怎么更新
(4) 更新的时候,是在root point那里更新,而不是就地更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容