如题,邻接表表示不太会表示,感觉不如邻接矩阵那么明白。如果单纯从过题的角度来说,只用邻接矩阵可以吗?
楼主的数学结构没有学好,这个问题显然是不可以的。
一般稠密图适合邻接矩阵,稀疏图适合邻接表,此外邻接矩阵从一个点找所有相邻点是O(V)的!这会让很多算法变得很慢!
此外,一个有200000点的图,如何用邻接矩阵优雅的存下来?开这么大的矩阵编译器直接报错.
不可以,
邻接矩阵的优点:能够O(1)判断两个点是否有边相连。缺点:空间复杂度是O(V^2)。
邻接表的优点:空间复杂度比较小,或者说是用最少的空间复杂度了,有多少条边就要多少,O(E).
缺点是,想判断两个点是否有边相连,必须找到与这个点相连的顶点都枚举一遍。
在不同算法里面会有不同的用处。邻接矩阵最强大的用处就是任意两点的最短路的floyd的算法,因为算法本身复杂度是O(V^3),因此空间复杂度O(V^2)显得完全无压力,然而该算法需要判断两点是否有边相连,因此邻接矩阵的优势就体现了。
另外一个用处就是最小生成树的prim算法,由于prim算法的核心就是通过更新每一个点与当前的树的距离来实现,在更新时需要频繁地获取两点之间的距离,因此邻接矩阵的用途就到了。从这个角度上看,prim算法比较适合稠密图。
邻接表是适合稀疏图,在单源最短路的dijkstra算法中,由于需要的遍历一个点的所有边,因此邻接表发挥了它的功效,另外如果使用优先队列进行优化,就可以在O(ElogV)的复杂度下解决单源最短路的问题。面对十万的规模,显然邻接矩阵是无能为力的。
另外相对应上面的prim算法,另一个经典的最小生成树的算法是kruskal算法,核心的关键在于从小到大枚举每一条边,然后利用并查集来判断这条边是否连接两个树,然后进行合并。由于涉及枚举边的操作,因此邻接表再一次发挥了它的功效!同时也体现了kruskal算法是在稀疏图中更适合。
总的来说,邻接矩阵和邻接表都必须掌握。哪个都不能放弃。
不可以,因为邻接矩阵的空间复杂度是O(V^2),大部分图论题目无法使用邻接矩阵存图,少部分顶点数较少的题目则可以使用邻接矩阵存图。对于顶点数10w+的图直接就无法使用邻接矩阵了,这是内存问题。
楼主的数学结构没有学好,这个问题显然是不可以的。
2015-06-25 未知一般稠密图适合邻接矩阵,稀疏图适合邻接表,此外邻接矩阵从一个点找所有相邻点是O(V)的!这会让很多算法变得很慢!
此外,一个有200000点的图,如何用邻接矩阵优雅的存下来?开这么大的矩阵编译器直接报错.
2015-06-24 未知不可以,
2015-06-25 未知邻接矩阵的优点:能够O(1)判断两个点是否有边相连。缺点:空间复杂度是O(V^2)。
邻接表的优点:空间复杂度比较小,或者说是用最少的空间复杂度了,有多少条边就要多少,O(E).
缺点是,想判断两个点是否有边相连,必须找到与这个点相连的顶点都枚举一遍。
在不同算法里面会有不同的用处。邻接矩阵最强大的用处就是任意两点的最短路的floyd的算法,因为算法本身复杂度是O(V^3),因此空间复杂度O(V^2)显得完全无压力,然而该算法需要判断两点是否有边相连,因此邻接矩阵的优势就体现了。
另外一个用处就是最小生成树的prim算法,由于prim算法的核心就是通过更新每一个点与当前的树的距离来实现,在更新时需要频繁地获取两点之间的距离,因此邻接矩阵的用途就到了。从这个角度上看,prim算法比较适合稠密图。
邻接表是适合稀疏图,在单源最短路的dijkstra算法中,由于需要的遍历一个点的所有边,因此邻接表发挥了它的功效,另外如果使用优先队列进行优化,就可以在O(ElogV)的复杂度下解决单源最短路的问题。面对十万的规模,显然邻接矩阵是无能为力的。
另外相对应上面的prim算法,另一个经典的最小生成树的算法是kruskal算法,核心的关键在于从小到大枚举每一条边,然后利用并查集来判断这条边是否连接两个树,然后进行合并。由于涉及枚举边的操作,因此邻接表再一次发挥了它的功效!同时也体现了kruskal算法是在稀疏图中更适合。
总的来说,邻接矩阵和邻接表都必须掌握。哪个都不能放弃。
2015-06-25 未知不可以,因为邻接矩阵的空间复杂度是O(V^2),大部分图论题目无法使用邻接矩阵存图,少部分顶点数较少的题目则可以使用邻接矩阵存图。对于顶点数10w+的图直接就无法使用邻接矩阵了,这是内存问题。
2015-06-25 未知