首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

最短路径算法大讨论!解决方法

2012-02-05 
最短路径算法大讨论!!目前我知道的最短路径算法只有DIJKSTRA算法跟A*算法,算是菜鸟了。前段时间本人优化了

最短路径算法大讨论!!
目前我知道的最短路径算法只有DIJKSTRA算法跟A*算法,算是菜鸟了。前段时间本人优化了下最短路径算法,效率大大提升。不知道DIJKSTRA算法能否算大数据量网络的最短路径。

算大数据量网络最短路径的算法都有哪些?效率如何?

欢迎各位高手进来讨论一二,让我们学习一下!顺带散分~

[解决办法]
高深莫测
[解决办法]
作为一名搞.Net的程序员,我感觉我跑错地方了
[解决办法]
用优先级队列维护带更新节点到已更新集合的距离
[解决办法]

探讨

就目前我所了解的dijkstra算法结构是介于邻接矩阵的,该数据结构无法计算包含五万个顶点的网络(我是指用个人的pc机)。不知道有没有基于邻接表的Dijkstra算法?它的效率又如何呢?

[解决办法]
最短路径常用的算法就是
两点间的最短距离:Dijkstra(可以用邻接表,处理更简单)
所有点对间的最短距离:Ford-Floyd
[解决办法]
我觉得你要研究的东西有意义,但现实的话,大量节点应该是通过architecture来解决的。
每一个网的节点是有限制的,这样就保证了最短路径算法的时间。相当于是树状的结构。
例如distance vector 算法,在实现的时候最大就是16。
这两个算法应该是network中路由主要两个吧。
scale的问题都是通过architecture的搞定的。


[解决办法]
DIJKSTRA+堆优化,可以大大提高速度
[解决办法]
dijkstra+斐波那契堆
spfa

dijkstra就是a*的一种特殊情况
[解决办法]
应该算慢的,秒级差不多。这种级别的数据量,应该用邻接表+斐波那契堆做优先队列。
(如果是做具体产品,应该在优先队列的优化上多下功夫,有比斐波那契堆更好的方法,不过需要看论文了)

探讨
当网络中的点达到100万个,边达到一千万条时,运行时间为两分钟。这样的速度如何?算快吗?

[解决办法]
Floyd:求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。

Dijkstra:求单源、无负权的最短路。时效性较好,时间复杂度O(V^2)。可以用堆优化。

Bellman-Ford:求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。

SPFA:是Bellman-Ford的队列优化,时效性相对好,时间复杂度O(kE)。(k<<V)。

宽搜:求单源无权最短路。矩阵记录法时间复杂度O(V^2);边表记录法时间复杂度O(kE)。



稠密图单源无负权最短路:Dijkstra。

稠密图单源有负权最短路:SPFA。

稀疏图单源最短路:SPFA或Bellman-Ford。

多源无负权最短路:Floyd。

多源无权最短路:宽搜。




[解决办法]
探讨

当网络中的点达到100万个,边达到一千万条时,运行时间为两分钟。这样的速度如何?算快吗?

[解决办法]
双向Dijkstra
双向A*
[解决办法]
在搜索中进行剪枝是必要的,灵活应用,没有现成的答案。
[解决办法]
探讨
dijkstra+斐波那契堆
spfa

dijkstra就是a*的一种特殊情况

[解决办法]
高 + 深 。 顶 浅 了。
[解决办法]
vector<pair<int,int> >
[解决办法]
就知道这么两个 还是教材上的 诶 悲剧~~
[解决办法]
lz是数学系的吗?
[解决办法]
谢谢。。 我收咯。。
[解决办法]
学习,收藏
[解决办法]
学习,收藏


[解决办法]

探讨
Floyd:求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。

Dijkstra:求单源、无负权的最短路。时效性较好,时间复杂度O(V^2)。可以用堆优化。

Bellman-Ford:求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。

SPFA:是Bellman-Ford的队列优化,时效性相对好,时……

[解决办法]
正在慢慢的学习当中
[解决办法]
我走错地方了 帮你顶下
[解决办法]
学习了!!!!
[解决办法]

[解决办法]
内容存入剪贴板
[解决办法]
太弱了。还有双向搜索和分层
[解决办法]
自己也不发个大数据例子来说明一下。太懒。引发不了大讨论
[解决办法]
>就目前我所了解的dijkstra算法结构是介于邻接矩阵的
从来没这种事。dij需要的图结构只要能遍历一个点的所有邻边就行。没人说只能用邻接矩阵。

>该数据结构无法计算包含五万个顶点的网络(我是指用个人的pc机)。
好扯谈。10w个点的稀疏图pc机1秒绝对没问题。当然极端的完全图的话5k个点左右是1秒的极限了。

>这种级别的数据量,应该用邻接表+斐波那契堆做优先队列。
乃太乐观了。就算是稠密图,100w个点的话俺觉得普通堆依然会比fibonacci堆要快。

>如果是做具体产品,应该在优先队列的优化上多下功夫
做具体产品应该在研究数据特点上多下功夫。比如权值大小是否有上限这种。

>双向Dijkstra
>双向A*
俺的经验是这俩东西快不了多少。但是增加的那些代码量嘛,代码能力不强的话debug得多花很多功夫
[解决办法]
学习。。。。
[解决办法]
探讨
>就目前我所了解的dijkstra算法结构是介于邻接矩阵的
从来没这种事。dij需要的图结构只要能遍历一个点的所有邻边就行。没人说只能用邻接矩阵。

>该数据结构无法计算包含五万个顶点的网络(我是指用个人的pc机)。
好扯谈。10w个点的稀疏图pc机1秒绝对没问题。当然极端的完全图的话5k个点左右是1秒的极限了。

>这种级别的数据量,应该用邻接表+斐波那契堆做优先队列。
乃太乐观了……

[解决办法]
用二叉堆就好了 斐波那契堆实际应用效果不一定好 理论上时间复杂度要优一些而已

双向会快蛮多的 不知道LS是怎么试出的时间差不多

另外如果是要最优解 那跃层这种事情是不用管的
[解决办法]
LZ这稀疏矩阵 没必要搞邻接表了吧
[解决办法]
不错不错.学习学习
[解决办法]
>请教下哦,10w个点的稀疏图pc机1秒绝对没问题? 
比如10w个点20w条边这种图,cpu只要是p4级别或以上的,没写进1秒的那基本都是自己写扯了。

>这遍历点的时间是怎么计算出来。
加普通堆的dij是ElogV,自己把E=20w,V=10w代进去,10^7的量都没到,1秒肯定是有信心的。
[解决办法]
完全技术贴,学习中
[解决办法]
学习的好东本
[解决办法]
其实算路应用最多的是在导航软件中,一般在pc机上需要1秒以上的到了设备上的时间就无法忍受了。
另外问下双向dijkstra真的比单向的快吗,我怎么觉得是一样的时间其实
[解决办法]
学习,学习,收藏。
[解决办法]
学习了!!!
[解决办法]
印象中有个什么模仿蚂蚁的算法
[解决办法]
收藏,继续关注
[解决办法]
学习了
------解决方案--------------------



[解决办法]
同学面试的时候问到了这个题。。。。。当时觉得很无语。。。。我觉得这是科学家研究的问题
[解决办法]
zheshigehaodongxi
[解决办法]
学习,收藏了。
好贴。

[解决办法]
留名。。。。。
[解决办法]

探讨
其实算路应用最多的是在导航软件中,一般在pc机上需要1秒以上的到了设备上的时间就无法忍受了。
另外问下双向dijkstra真的比单向的快吗,我怎么觉得是一样的时间其实

[解决办法]
探讨

Floyd:求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。

Dijkstra:求单源、无负权的最短路。时效性较好,时间复杂度O(V^2)。可以用堆优化。

Bellman-Ford:求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。

SPFA:是Bellman-Ford的队列优化,……

[解决办法]
用二叉堆就好了 斐波那契堆实际应用效果不一定好 理论上时间复杂度要优一些而已

双向会快蛮多的 不知道LS是怎么试出的时间差不多

另外如果是要最优解 那跃层这种事情是不用管的
[解决办法]
不懂 ,学习下了
[解决办法]
太强大了
[解决办法]
看看算法设计的教程,对各类算法的效率都有评价的。
[解决办法]
好高深
[解决办法]
做为.net程序员
我不应该点进来的
[解决办法]
早还给老师了...

mark
[解决办法]
楼主代码for循环嵌套太多
[解决办法]
一试
C/C++ code
void Min_path(long **cost = new long * [vertexNumber], long **path = new long * [vertexNumber]){    /******************************************************用于精确计算运行时间*********************************************************************/    QueryPerformanceFrequency(&Frequency);         QueryPerformanceCounter(&BegainTime) ;      /******************************************************用于精确计算运行时间*********************************************************************/    long i , j ,u , v , E , min , count , n = vertexNumber ;    long s[vertexNumber] ;    long pos[vertexNumber] ;    long dist[vertexNumber] ;    //     cout << "Start Point and End Point :" ;    //     cin >> v >> E ;    v = 236;     E = 542;    for (i = 0 ; i < n ; i ++)    {        s[i] = 0 ;        dist[i] = cost[i][v - 1] ;        path[i][0] = v - 1 + 1 ;        pos[i] = 0 ;    }    s[v - 1] = 1 ;    dist[v-1] = 0 ;    for (count = 1 ; count < n ; count ++)    {        min = MAXINF ;        for (i = 0 ; i < n ; i ++)        {            if (s[i] == 0 && dist[i] < min)            {                u = i ;                min = dist [i] ;            }        }        s[u] = 1 ;        path[u][++ pos[u]] = u + 1 ;        for (i = 0 ; i < n ; i ++)        {            if (s[i] == 0)            {                if (dist[u] + cost[i][u] < dist[i] && cost [i][u] < MAXINF)                {                    dist[i] = dist[u] + cost[i][u] ;                    for (j = 0 ; j <= pos[u] ; j ++)                    {                        path[i][j] = path[u][j] ;                    }                    pos[i] = pos[u] ;                }            }        }    }    /******************************************************用于精确计算运行时间*********************************************************************/    QueryPerformanceCounter(&EndTime);        cout << "Dijkstra 算法的运行时间(单位:s):" <<(double)( EndTime.QuadPart - BegainTime.QuadPart )/ Frequency.QuadPart <<endl;         /******************************************************用于精确计算运行时间*********************************************************************/    for (i = 0 ; i <= pos[E - 1] ; i ++)    {        cout << path[E - 1][i] << "," ;    }    cout << "\t" ;    cout << dist[E - 1] ;    cout << endl ;    system("pause");} 


[解决办法]
看不懂
[解决办法]
????????????????
[解决办法]
好高深。。学习!
[解决办法]
看不懂的路过
[解决办法]
帮你们顶一下吧。
[解决办法]
正在学习中。
[解决办法]
目前应用比较广泛的导航算法应该是双向A*算法, 优化来讲基本是对图进行提层, 另外A*算法中加入方向扩展的控制(加入期望 过滤可能性小的node点)。 当A*扩展点是遇到重要的连通点是 就往上层图跳转 继续A* 一直到双向碰撞为止。 基本上很多的优化都是基于这种思想
[解决办法]
帮你们顶一下吧。
[解决办法]
路过,看高见。
[解决办法]
深奥啊!
[解决办法]
接分啊接分~~~
[解决办法]
学习了!
[解决办法]
还是有些价值!
[解决办法]
看不懂啊
[解决办法]
学习一下再来
[解决办法]
我的妈呀···
都是高手啊·
[解决办法]
厉害,,

热点排行