图的Java实现

这几天在研究千里码上的一道题。题目是处理一个热点营销问题,初级的题目是:

100个微信用户的关系列表。为了方便表达,把名字变成一个整数,这100个用户的名字分别为1-100。每行有两个名字,代表这两人互为微信好友。

这题我是把100个微信用户保存在数组里面,然后使用迭代的方法遍历得出结论。

但第二个级别的题目讲微信用户的数量升级到了10万。这种情况下使用迭代很快就Stack over flow了。

于是便再往上寻求更好的解决方案,得出思路是可能需要将迭代转为多重循环来实现。但是这个业务逻辑我思考得有些混乱了,导致很难如此处理。

故只能寻求其他的解决方案。经过一番搜索,发现这个问题是一个典型的数据结构问题,10万个微信用户构成了一张图。

当年没有好好学习数据结构,所以这里得复习下:

图(graph)

如上图,我们可以将V0、V1、V2、V3看成是微信用户,他们之间的边代表用户之间的关系。

用图的术语,我们把V0~V3称为Vertex,他们的关系称为Edge。

那么一张图可以视为包含了Vertex和Edge的集合。表示为:G=(V, E)

从数据的表示方法来说,有二种表示图的方式:一种是邻接矩阵,其实是一个二维数组;一种是邻接表,其实是一个顶点表,每个顶点又拥有一个边列表。

经过一番谷歌,邻接矩阵的处理方法可以参考这篇文章:http://blog.csdn.net/laozhaokun/article/details/20901511

邻接表的处理方法可以参考这篇文章:http://www.cnblogs.com/hapjin/p/4760934.html

邻接矩阵的处理思路是将顶点和关系分别保存到一个一维数组和一个二维数组中。但是,即使我们保存的是int型数据,一旦数据量达到10万。那么这个数组需要使用的内存空间为:

100000 * 100000 * 4Byte = 40GB

显然一般的电脑是无法处理这样的数据量的。

那么我们暂时只能考虑使用邻接表的处理方案。

参照博主的代码,拷贝下来之后运行成功,最终整理成Github项目,有需要的朋友直接看代码吧:

https://github.com/hxy91819/qlcoder


参考资料:

http://www.cnblogs.com/hapjin/p/4760934.html

http://blog.csdn.net/laozhaokun/article/details/2090151

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,822评论 0 19
  • 内容整理于鱼c工作室教程 1. 图的基本概念 1.1 图的概念 图(Graph)是由顶点的有穷非空集合和顶点之间边...
    阿阿阿阿毛阅读 3,262评论 0 2
  • 数据结构学不好,c++就到后面会很迷,数据结构真滴很重要啊,上机题一定要认真做,紧密的和实际操作的代码联系在一起是...
    Nancy_Shi阅读 742评论 0 4
  • 不要总想着这件事会不会发生,那件事会不会发生,想的多做的少,总感觉草木皆兵。 其实大多数我们所担心的事情都不会发生...
    翠霞_0256阅读 363评论 1 4
  • 一、链接 文字连接,图片链接,页面内连接 二、表格
    LPark阅读 169评论 0 0