这几天在研究千里码上的一道题。题目是处理一个热点营销问题,初级的题目是:
100个微信用户的关系列表。为了方便表达,把名字变成一个整数,这100个用户的名字分别为1-100。每行有两个名字,代表这两人互为微信好友。
这题我是把100个微信用户保存在数组里面,然后使用迭代的方法遍历得出结论。
但第二个级别的题目讲微信用户的数量升级到了10万。这种情况下使用迭代很快就Stack over flow了。
于是便再往上寻求更好的解决方案,得出思路是可能需要将迭代转为多重循环来实现。但是这个业务逻辑我思考得有些混乱了,导致很难如此处理。
故只能寻求其他的解决方案。经过一番搜索,发现这个问题是一个典型的数据结构问题,10万个微信用户构成了一张图。
当年没有好好学习数据结构,所以这里得复习下:
如上图,我们可以将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