Dijkstra算法_北京地铁换乘_android实现-附带源码.apk
2013-09-23 11:50
239 查看
Dijkstra算法_北京地铁换乘_android实现android2.2+
源码下载apk下载
直接上图片如下:
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
//EastSouthWestNorthNortheastNorthwestSoutheastSouthwest
privatebooleanCK(booleanisadd,double[]bxy,double[]exy)
{
returntrue;
}
整个查询过程耗时不超过20毫秒
单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。
一.最短路径的最优子结构性质
该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。
假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。
二.Dijkstra算法
由上述性质可知,如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这种思路,
假设存在G=<V,E>,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。
1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;
2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})
3.知道U=V,停止。
直接上图片如下:
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。
初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
/**时间复杂度比较复杂,因为换乘结点的关系导致的 最坏情况下(每个站之间都有连线,但是地铁线路图实际上是不存在次情况的):O(2^n) 相反 最优情况下(之间只有唯一的连接点,次情况下也不是很现实的,有的地铁换乘是多个换乘点都在同一条线上的) 此时用hashtable所以是:O(1) */ privatejava.util.HashSet<String>GetF(java.util.HashSet<String>beginlist) { if(mainht==null||mainht.isEmpty()) { returnnull; } returnlist=newjava.util.HashSet<String>(); if(beginlist.isEmpty()) { isend=1; } else { /**O(n) */ for(Stringstrbegin:beginlist) { if(strbegin.indexOf("-")==-1&&mainht.containsKey(strbegin)==true)//havethiskeyandfirstloaddata { bxy=(double[])DCht.get(strbegin); earry=mainht.get(strbegin).toString().split("[,]",-1); for(Stringar:earry) { exy=(double[])DCht.get(ar); isadd=CK(isadd,bxy,exy); if(isadd==true) { returnlist.add(strbegin+"-"+ar); isend=0; } } } elseif(strbegin.indexOf("-")>-1&&mainht.containsKey(strbegin.substring(strbegin.lastIndexOf("-")+1))==true) { temgstr=strbegin.substring(strbegin.lastIndexOf("-")+1); bxy=(double[])DCht.get(temgstr); earry=mainht.get(temgstr).toString().split("[,]",-1);//exchangenode for(Stringar:earry) { exy=(double[])DCht.get(ar); isadd=CK(isadd,bxy,exy); if(isadd==true) { if(!strbegin.contains(ar)) { returnlist.add(strbegin+"-"+ar); } isend=0; } } } } } earry=null; if(isend==0) { returnGetF(returnlist); } else { returnnull; } }
privatebooleanCK(booleanisadd,double[]bxy,double[]exy)
{
returntrue;
}
整个查询过程耗时不超过20毫秒
单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。
一.最短路径的最优子结构性质
该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。
假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。
二.Dijkstra算法
由上述性质可知,如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。根据这种思路,
假设存在G=<V,E>,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。
1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;
2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})
3.知道U=V,停止。
相关文章推荐
- 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
- 转载:android 源码 打包成apk的实现
- Android端无线打印功能实现(附带源码Demo)
- android apk反编译到java源码的实现方法
- android 源码 打包成apk的实现
- android 源码 打包成apk的实现
- 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享
- 双向广搜的DIJKSTRA算法--简易的北京地铁导航实现
- 双向广搜的DIJKSTRA算法--简易的北京地铁导航实现
- Android中的Apk的加固(加壳)原理解析和实现
- Unity中针对Android Apk的签名验证(C#实现),防止二次打包
- 浅析Android 蜂巢中左下角三个导航键的实现源码
- android仿iPhone滚轮控件实现及源码分析(一)
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)
- Android通过源码编译apk获得系统权限
- [Android]实现静默安装APK的两种方法
- android 源码编译 怎么把so ,a,jar打包到apk里
- java swing mysql实现的仓库库存管理系统源码附带视频指导教程
- Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架
- 基于 Facebook Redex 实现 Android APK 的压缩和优化