查看: 2830| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 刷题总结直播帖子

🔗
匿名用户-3GXCF  2019-11-28 15:15:14 |倒序浏览

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近在帮忙朋友刷题,随手写了些总结和leetcode题号,干脆发上来大家看看。如果有人看的话我就一直写,也可以提出想要我写的部分,然后这个google doc是可以in line comment的,错误和建议请一并指出。我都是融合网上各种资料,都加了reference,如果侵权的话要告诉我哦。

我就不设置大米限制了。今天就先过一下union find,明天再贴别的,如果有人看的话会继续的。没人看这个帖子就会死掉。。。然后我这个写的会比较简单,大佬们直接跳过。

2019-11-27 Union Find


Algorithm 4th edition - 1.5 Case Study: Union-Find 有空可以看这个


总而言之就是
"人以类聚,物以群分"
(相似的在一起(合并)
查找自己属于哪一类(查找)
两个两个是否是同一类)
reference

总结一下它的各种操作就是


Union: 两个元素p和q,分别找到他们的根节点,然后将其中元素的root指向另外的一个元素的root
Find: 找到一个元素的根节点,找到parent的parent的parent一直到最终的parent
Connected: 判断两个元素p和q是不是最终指向同一个root
Count: 有多少不相关的root

我们来试试implement上面的这个



Code reference

我这个做法是用一个list来表示每个node,每个node的id就是自己的index,然后value就是root的index。还有一种做法是用dictionary或者自己定义一个新的node class

你可以用这个code测试一下


Code reference

我们上面的这个做法叫QuickFind,它并不是很efficient,因为我们每次union的时候需要遍历整个数据。还有另外一个做法叫QuickUnion




Code reference

这个方法不一样的是,在find这一步,一直找一直找到parent的parent直到root,然后union这一步就只需要通过find找到各自的root不需要遍历整个数组啦。是不是超级简单。同样的你可以用上面的code来测试一下。

但是你再看看,虽然我们改进的union这一步,但是find这一步其实比之前的叫QuickFind的find那一步慢了好多。。。 有没有看出他们为什么各自叫quickfind和quickuion??

Quickfind就是find这一步很快,但是union慢
Quickunion就是union这一步很快,但是find慢

哎怎么办呢?其实还有一种做法叫,Weighted Quick Union来帮助QuickUnion加快find这个步。改进的方法可以是,在union之前,先判断两个树的大小(节点数量),将小点的树附加到大点的树上,这样,合并后的树的深度不会变得非常大。我们直接上图比较吧。



但是说实话它有没有好到哪里去,还有一种做法叫path compression。To implement path compression, we just add another loop to find() that sets the id[] entry corresponding to each node encountered along the way to link directly to the root. The net result is to flatten the trees almost completely, approximating the ideal achieved by the quick-find algorithm.




我们来做做看path compression怎么样。



Code reference
是不是超级简单??


好了你把下面的题都做了吧。对了上面都是用数组做的,你也可以用dictionary哈或者自己定义一个TrieNode。

Leetcode作业
Longest Consecutive Sequence   
Friend Circles   
Couples Holding Hands
Redundant Connection
Number of Islands
Accounts Merge
Redundant Connection II
Surrounded Regions




补充内容 (2019-11-29 15:20):
上面path compression不小心写错了。 应该是 self.id[p] = self.find(self.id[p])

评分

参与人数 3大米 +5 收起 理由
14417335 + 3
Tzh161 + 1 赞一个
jxlxt + 1 赞一个

查看全部评分


上一篇:35岁转计算机,每一天都是挑战,加油!
下一篇:哪里能找到2019年微软高频题目合集
🔗
波风水门 2019-11-29 02:19:59 | 只看该作者
全局:
path compression 意义下的 find 函数写得不对哦。
你这个只是把每个点连到了它的父节点的父节点而已。

评分

参与人数 1大米 +3 收起 理由
hey123_1 + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

地里匿名用户
🔗
匿名用户-3GXCF  2019-11-29 15:16:30
波风水门 发表于 2019-11-29 02:19
path compression 意义下的 find 函数写得不对哦。
你这个只是把每个点连到了它的父节点的父节点而已。

不好意思犯了这么低级的错误,感谢感谢我更正一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表