北京地铁线路图纯算法附带求极权值(原创) 性能提升版

先上一张大家都看过而且熟悉的北京地铁线路图:

其中本人由于时间时间问题所以就写入了:昌平线,1,2,4,5,6,8,10,13共9条线路图:

接下来我说说我的思路 我的思路是这样的:

首先定义变量b,e分别代表用户搜索的开始地点和到达地点

然后加载地铁线路图主数据,下文代码中的LoadData()方法 ,此时要说明一点LoadData()方法加载的数据即是北京地铁线路图换乘的所有地铁站,放在一个有序的集合里,

【此处要ps一下,后面我会用int类型的value代表各个地铁站换乘的站名称再放在一个有序的容器里(放入方法可用选择排序),这样做的目的是为了后面代码高性能查找(以O(lgn)的二分法快速查找)】 先说到这里 后期会用此方法!

下面开始,为了便于表达本人用伪代码表示

 设置北京地铁线路图换乘的所有地铁站的集合为Ux, GetLine(string stationname),函数GetPreOrNextNode(string stationname)

 GetLine方法代表根据地铁站名称查找所在的地铁线,GetPreOrNextNode方法代表根据地铁站名称查找周围的换乘站(换乘结点)

0:如果b,e都为结点(换乘站) 直接进行第3步;

1:string[] nodebegin= Getline(b);string [] nodeend=gteline(e);

2:把1中的nodebegin和nodeend放入Ux集合中;

3:把nodebegin,nodeend传入方法  GetF() 进行递归操作;

这里我给出GetF()代码的一部分,要是要完整代码请使劲  点击我

 1  List<string> GetF(List<string> beginlist)
 2         {
 3             if (maindata == null) return null;
 4 
 5             List<string> returnlist = new List<string>();
 6             if (beginlist.Count == 0)
 7                 isend = 1;
 8             else
 9             {
10                 foreach (string fs in beginlist)
11                 {
12                     if (fresult.Contains(fs) == false)
13                         fresult.Add(fs);
14                 }
15                  //此处省略了 比较复杂31             }
32             if (isend == 0)
33                 return GetF(returnlist);
34             else
35                 return null;
36         }

关于GetF() 方法原理可以这样理解:我们已经知道开始结点和结束结点,所以我们不用递归整个换乘结点,那么我们将除开开始结点和结束结点之外的结点给移除,这里的问题来了,

QA:我怎么知道什么结点该移除呢?

AN:因为我没能求的极权值,依次把极大的权值相关的结点除去。

这里要用到方法的核心了 贴一张图给看看:

 Dijkstra无向图算法! 因为我们知道换乘是双向的,不是单向的!

 ps:之前用的递归性能很低,由于代码的繁琐思维的混乱!

说了这么多我给出运行结果:

测试1:五道口----前门(非换乘站)

程序测试开始时间:2013 04 26 19 50 00 124

程序测试结束时间:2013 04 26 19 50 01 265

五道口------------->前门:
五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-平安里-西四-灵境胡同-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-西四-灵境胡同-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-车公庄-阜成门-复兴门-西单-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-车公庄-平安里-西四-灵境胡同-西单-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-新街口-平安里-西四-灵境胡同-西单-复兴门-长椿街-宣武门-和平门-前门
五道口-知春路-大钟寺-西直门-积水潭-鼓楼大街-安定门-雍和宫-东直门-东四十条-朝阳门-建国门-北京站-崇文门-前门
.

.此处省略n个 要想看全部 请点击我

.

count:774

权最大为:五道口-上地-西二旗-龙泽-回龙观-霍营-立水桥-北苑-望京西-芍药居-太阳宫-三元桥-亮马桥-农业展览馆-团结湖-呼家楼-金台夕照-国贸-双井-劲松-潘家园-十里河-分钟寺-成寿寺-宋家庄-石榴庄-大红门-角门西-马家堡-北京南站-陶然亭-菜市口-宣武门-西单-灵境胡同-西四-平安里-车公庄-阜成门-复兴门-南礼士路-木樨地-军事博物馆-公主坟-西钓鱼台-慈寿寺-车道沟-长春桥-火器营-巴沟-苏州街-海淀黄庄-人民大学-魏公村-国家图书馆-动物园-西直门-积水潭-鼓楼大街-安定门-雍和宫-东直门-东四十条-朝阳门-建国门-北京站-崇文门-前门:106.463
权最小为:五道口-知春路-大钟寺-西直门-车公庄-阜成门-复兴门-长椿街-宣武门-和平门-前门:14.204

测试2:西二旗----西单(换乘站)

程序测试开始时间:2013 04 26 20 00 03 526

程序测试结束时间:2013 04 26 20 00 04 854

西二旗------------->西单:
西二旗-西直门-平安里-西单
西二旗-西直门-车公庄-复兴门-西单
西二旗-西直门-车公庄-复兴门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-西单
西二旗-霍营-北土城-鼓楼大街-西直门-平安里-西单
西二旗-西直门-车公庄-复兴门-宣武门-崇文门-东单-西单
西二旗-西直门-国家图书馆-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-霍营-立水桥-惠新西街南口-雍和宫-东四-东单-西单
西二旗-霍营-北土城-鼓楼大街-西直门-车公庄-复兴门-西单
西二旗-霍营-北土城-鼓楼大街-雍和宫-东四-东单-西单
西二旗-霍营-北土城-惠新西街南口-雍和宫-东四-东单-西单
西二旗-西直门-鼓楼大街-北土城-惠新西街南口-雍和宫-东四-东单-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-崇文门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-东单-西单
西二旗-西直门-车公庄-复兴门-宣武门-崇文门-建国门-东单-西单
西二旗-西直门-国家图书馆-海淀黄庄-慈寿寺-公主坟-复兴门-宣武门-西单
西二旗-霍营-立水桥-惠新西街南口-雍和宫-鼓楼大街-西直门-平安里-西单
西二旗-霍营-立水桥-惠新西街南口-北土城-鼓楼大街-西直门-平安里-西单
西二旗-霍营-北土城-鼓楼大街-西直门-车公庄-复兴门-宣武门-西单
西二旗-霍营-北土城-知春路-海淀黄庄-国家图书馆-西直门-平安里-西单
西二旗-霍营-北土城-知春路-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-霍营-北土城-惠新西街南口-雍和宫-鼓楼大街-西直门-平安里-西单
西二旗-西直门-鼓楼大街-北土城-知春路-海淀黄庄-慈寿寺-公主坟-复兴门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-崇文门-宣武门-复兴门-西单
西二旗-西直门-鼓楼大街-雍和宫-东四-东单-建国门-崇文门-宣武门-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-崇文门-东单-西单
西二旗-西直门-鼓楼大街-雍和宫-东直门-朝阳门-建国门-崇文门-宣武门-西单
西二旗-西直门-车公庄-复兴门-宣武门-角门西-宋家庄-崇文门-东单-西单
西二旗-霍营-立水桥-望京西-芍药居-东直门-雍和宫-东四-东单-西单
西二旗-霍营-立水桥-望京西-芍药居-东直门-朝阳门-建国门-东单-西单


.

.此处省略n个 要想看全部 请点击我

.

count:4602
权最大为:西二旗-西直门-车公庄-复兴门-公主坟-慈寿寺-海淀黄庄-知春路-北土城-霍营-立水桥-望京西-芍药居-三元桥-呼家楼-国贸-宋家庄-角门西-宣武门-崇文门-建国门-朝阳门-东直门-雍和宫-东四-东单-西单:117.337


权最小为:西二旗-西直门-平安里-西单:18.4

最后我我发现百度地图计算不准确了:

解释如下 先看看本人的部分换乘数据:len表示b1到b2之间的路程(this date from baidu map),timem代表时间,但是我还没用到timem次字段,预留为后期做准备!

////昌平线,1,2,4,5,8,10,13, :1号线开始
b1 = "苹果园";
b2 = "公主坟";
len = "12.7";
timem = "22";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "复兴门";
b2 = "公主坟";
len = "4";
timem = "8";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "复兴门";
b2 = "西单";
len = "1.7";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "东单";
b2 = "西单";
len = "3.6";
timem = "8";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "东单";
b2 = "建国门";
len = "2.3";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "国贸";
b2 = "建国门";
len = "2.8";
timem = "4";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "国贸";
b2 = "四惠惠";
len = "3";
timem = "6";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "四惠东";
b2 = "四惠惠";
len = "1.7";
timem = "3";
SWAP(backlist, ref arry, b1, b2, len, timem);
b1 = "四惠东";
b2 = "土桥";
len = "16.6";
timem = "29";
SWAP(backlist, ref arry, b1, b2, len, timem);
////昌平线,1,2,4,5,8,10,13, :1号线end

看到了“权最小为:西二旗-西直门-平安里-西单:18.4”

我再搜百度的: 是19km

我的是18.4 km ,   小于百度的搜索数据     还有一系列问题等待这去解决! 

热烈欢迎大家发表自己的意见和其他!

下篇再见! 

BY:SF

time: 2013-04-26-20:21

原文地址:https://www.cnblogs.com/chinhi/p/bejingsbwmap.html