美文网首页
图的Java实现

图的Java实现

作者: 沉静说 | 来源:发表于2017-08-27 17:35 被阅读15次

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

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

相关文章

  • ReactNatvie通讯机制

    通讯框架图 JAVA层 Java层,这块的实现在ReactAndroid中• ReactContext : A...

  • 2017下半年技术目标

    学习UML类图 学习设计模式(java实现)

  • 图的Java实现

    这几天在研究千里码上的一道题。题目是处理一个热点营销问题,初级的题目是: 100个微信用户的关系列表。为了方便表达...

  • Decoder

    BaseImageDecoder.java实现了ImageDecoder。调用ImageDownloader获取图...

  • 第八章 java容器 (集合)

    java 容器---集合 一、各种集合的整体关系图 Collection框架类图 总体关系图 接口继承关系和实现 ...

  • ArrayList

    点击查看继承体系图 ArrayList实现了List, RandomAccess, Cloneable, java...

  • Android中的TextView实现文字变色

    方法一:xml代码片段: Java代码片段: 效果图如下:方法二:用SpannableString来实现。Java...

  • ThreadPoolExecutor线程池总结

    java线程池接口类图 顶级接口Executor,其具体实现类是ThreadPoolExecutor,该实现类包含...

  • java IO入门笔记

    1.java IO流的概念,分类,类图 1.1. java IO 流的概念 java的io是实现输入和输出的基础,...

  • java.util.ArrayList源码解析

    java集合框架图 所属包 package java.util; 继承与实现关系 属性 构造方法 构造方法1: 构...

网友评论

      本文标题:图的Java实现

      本文链接:https://www.haomeiwen.com/subject/kyqidxtx.html