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

Berkeley CS 61B Data Structures(in Java) Project3 Kruskal

全局:
公开课
学校名称: Berkeley
Unit号: 25
开课时间: 2014
课程全名: CS 61B Data Structures(in Java)
平台: Coursera

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

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

x
好像还没有帖子.







上一篇:[HomeWork] Algorithms, Part I (week 1)
下一篇:斯坦福的iOS 8公开课开课了
推荐
Alansong641 2020-2-17 18:27:55 | 只看该作者
全局:
附上截图:


【part 1】:生成一个Weighted Undirected Graph
重点在于理解搞这么复杂数据结构的意义,是为了保证时间复杂度在一定范围内,只要理解了数据结构。其实现就不难。
对于实现你需要进行Augmenting Data Structure,满足readme中的reference指向。例如EdgeNode中新加的Vertex1和Vertex2 这两个field指向这个edge的两端的Vertex的Node;或是VertexList中node的指向VertexInApp的reference,还需加上它们的getter和setter。如图是我加的一些笔记:(V是Vertex的缩写)




因为利用了homework05中的链表(DList和DListNode),上面的Augment是写在了它的父类(ListNode)中。

【part 2】:利用Kruskal算法求最小生成树(Minimum Spanning Tree)
因为VertexPair类是protected的,不能被package外引用。所以我自己写了个myPair类,里面维护着vertex1 vertex2和weight三个field。
其次利用了homework08中的QuickSort算法,将myPair enqueue到LinkedQueue中,进行quicksort,因为quicksort是compare-based的算法,所以myPair类的签名需要implement Comparable,并override compareto算法(只compare里面的weight即可)。
最后一部分是利用并查集(DisjointSet)来实现,和homework09一样,find两个vertex,如果他们的parent不是同一个,说明不在同一个set里,两个vertex增加edge,因为是edge weight从小到大进行判断,所以保证了生成的树为最小。还有一个问题在于Vertex 类是object,并查集是通过Array实现的,所以需要将每个Vertex映射(map)一个独一无二的int,最好的办法是通过Dictionary(key+value),字典通过HashTable实现最方便。



回复

使用道具 举报

推荐
farewell 2016-8-27 18:47:33 | 只看该作者
全局:
花了好久终于做完了,很多东西其实都没能好好掌握,做这个project感觉把所有知识都梳理起来了,赶紧结束CS61B课程,还有一个月就开学了,得要抓紧了,不然真找不到实习了呜呜呜第一部分构建这个图,把顶点存入hashtable的同时还要建立一个链表,每个顶点同时还是这个顶点邻接edge链表的sentinel,edge链表中的每个元素还通过hashtable与vertexpair对应。对于任意一条边,都有对应的partner,这样在删除过程中可以方便找到另一条边。同时,为了快速找到vertex在链表中的位置,vertex数据结构中还加入了一个node
第二部分用kruskal产生最小生成树,首先产生一颗没有edge的树,以及含有每个顶点的disjoint set,将edge的weight用homework8中的quicksort排序,对于每个顶点,通过hashtable找到这个点在disjoint set中的标号,如果不在一个set里就union,这里吸取homework9的教训,find以后得到的是root值,在union时候必须用这个root值。


评分

参与人数 1学分 +1 收起 理由
yingy4 + 1

查看全部评分

回复

使用道具 举报

推荐
lyc1994 2015-8-15 18:59:19 | 只看该作者
全局:
终于写完project3!project3的主要内容是设计出储存undirected, weighted graph的数据结构(Part1),并在此基础上使用Kruskal算法产生minimum spanning tree(Part 2)。
因为对存,取,删除graph中的vertex以及edge有时间要求,所以Part1中的数据结构十分复杂,用到了哈希表,DList。Part2部分则涉及到了sorting,Disjoint Sets,可以说覆盖了课程后半部分的大部分知识点。不过在做完homework 9之后,做本project就没有问题了。
由于graph的数据结构中有大量引用,例如partner references,vertex哈希表中的对象与vertex list中的对象相互引用,edge对象引用vertex对象,vertex对象引用edge list对象等等,我的处理方法是定义DListNode的子类GraphListNode来描述vertex以及edge。在GraphListNode中定义两个指向GraphListNode引用以及一个指向GraphList的引用,以适应graph的复杂结构。这里地里的筒子都是用什么方法处理的呢?
project3做完,再看掉剩下的课,CS61B可以告一段落了。。
更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

🔗
Believers 2015-12-17 19:18:25 | 只看该作者
全局:
本帖最后由 Believers 于 2015-12-17 19:22 编辑

图的构建真的花了好久好久好久……对哈希的操作还是不够熟练。

这个project还是非常好,因为后半部分的hw和lab很少涉及到graph方面的知识,通过这个project可以说是对所有的知识都进行了复习。
只剩一个hw10了!!!!!!
更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

🔗
lqwandyy 2015-12-18 21:23:43 | 只看该作者
全局:
我有很大一个疑问就是,怎么构建这个哈希表? key就是外面的节点,value就是里面的节点?然后如何输出外面的节点(从里面的这个链表出发)??
回复

使用道具 举报

🔗
Believers 2015-12-18 21:50:54 | 只看该作者
全局:
lqwandyy 发表于 2015-12-18 21:23
我有很大一个疑问就是,怎么构建这个哈希表? key就是外面的节点,value就是里面的节点?然后如何输出外面 ...

我是这样想的,vertex的DList里有DListNode,它的item field指向一个自己定义的VertexNode(内部点),这个Node也有一个item field指向外部点。哈希表的value我指向了DListNode。也不知道算不算符合要求。
回复

使用道具 举报

🔗
lqwandyy 2015-12-19 15:45:35 | 只看该作者
全局:
由于之前的一个BUG没有发现,导致第一部分就花了很长时间。。。终于弄好了。

proj3-1.jpg (37.11 KB, 下载次数: 3)

proj3-1.jpg
回复

使用道具 举报

🔗
hypsm 2016-2-6 18:09:19 | 只看该作者
全局:
请教一下Project3的代码量大概有多少? 不知道3天能不能搞定... (Project1 大概花了1天的时间)
回复

使用道具 举报

🔗
sunnysun18 2016-5-15 11:23:45 | 只看该作者
全局:
project 3差不多花了一天半的时间。。。
更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1 坚持的不错,再接再厉!

查看全部评分

回复

使用道具 举报

🔗
elyn 2016-5-24 23:48:25 | 只看该作者
全局:
快哭了,花了三天时间。。。。。。。。。。。。。。。。。
终于把CS61B刷完了
更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1学分 +1 收起 理由
yingy4 + 1 坚持的不错,再接再厉!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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