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

最短路径算法大讨论!该如何解决

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

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

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

欢迎各位高手进来讨论一二,让我们学习一下!顺带散分~
[解决办法]
高深莫测
[解决办法]
作为一名搞.Net的程序员,我感觉我跑错地方了
[解决办法]
用优先级队列维护带更新节点到已更新集合的距离
[解决办法]

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

把邻接矩阵改为 vecor<int> ve;速度就提上去,对于稀疏矩阵,速度要快好几倍吧
[解决办法]
最短路径常用的算法就是
两点间的最短距离: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万个,边达到一千万条时,运行时间为两分钟。这样的速度如何?算快吗?

慢,路由让你搜个路径2分钟,你干么。
15楼强大。
[解决办法]
双向Dijkstra
双向A*
[解决办法]
在搜索中进行剪枝是必要的,灵活应用,没有现成的答案。
[解决办法]
引用:
dijkstra+斐波那契堆
spfa

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


A*的公式:F=G+H;当H=0时,就是Dijkstra
[解决办法]
高   + 深 。 顶 浅 了。
[解决办法]
vector<pair<int,int> >
[解决办法]


就知道这么两个 还是教材上的  诶  悲剧~~
[解决办法]
lz是数学系的吗?
[解决办法]
谢谢。。 我收咯。。
[解决办法]
学习,收藏
[解决办法]
学习,收藏
[解决办法]


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

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

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

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

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

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

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


请教下哦,10w个点的稀疏图pc机1秒绝对没问题? 这遍历点的时间是怎么计算出来。一直不知道pc机的时间和运算时间的计算方法。
[解决办法]
用二叉堆就好了 斐波那契堆实际应用效果不一定好 理论上时间复杂度要优一些而已

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

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

>这遍历点的时间是怎么计算出来。
加普通堆的dij是ElogV,自己把E=20w,V=10w代进去,10^7的量都没到,1秒肯定是有信心的。
[解决办法]
完全技术贴,学习中
[解决办法]
学习的好东本
[解决办法]
其实算路应用最多的是在导航软件中,一般在pc机上需要1秒以上的到了设备上的时间就无法忍受了。


另外问下双向dijkstra真的比单向的快吗,我怎么觉得是一样的时间其实
[解决办法]
学习,学习,收藏。
[解决办法]
学习了!!!
[解决办法]
印象中有个什么模仿蚂蚁的算法
[解决办法]
收藏,继续关注
[解决办法]
学习了
[解决办法]
该回复于2010-11-27 20:49:31被版主删除
[解决办法]
同学面试的时候问到了这个题。。。。。当时觉得很无语。。。。我觉得这是科学家研究的问题
[解决办法]
zheshigehaodongxi
[解决办法]
学习,收藏了。
好贴。

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

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

当然要快了。。  
双向的时候只要两边碰头 搜索就结束了
[解决办法]
引用:
Floyd:求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。

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

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

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

强人,顺便顶下16楼的反问!
[解决办法]
用二叉堆就好了 斐波那契堆实际应用效果不一定好 理论上时间复杂度要优一些而已

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

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

mark
[解决办法]
楼主代码for循环嵌套太多
[解决办法]
一试

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* 一直到双向碰撞为止。 基本上很多的优化都是基于这种思想
[解决办法]
帮你们顶一下吧。
[解决办法]
路过,看高见。
[解决办法]
深奥啊!
[解决办法]
接分啊接分~~~
[解决办法]
学习了!
[解决办法]
还是有些价值!
[解决办法]
看不懂啊
[解决办法]
学习一下再来
[解决办法]
我的妈呀···
都是高手啊·
[解决办法]
厉害,,

热点排行