北京地铁线路图纯算法附带求极权值(原创) 性能提升版
先上一张大家都看过而且熟悉的北京地铁线路图:
其中本人由于时间时间问题所以就写入了:昌平线,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/archive/2013/04/26/bejingsbwmap.html
北京地铁线路图纯算法附带求极权值(原创) 性能提升版相关推荐
- 北京地铁线路图(最新-非常实用)
北京地铁线路图: http://map.baidu.com/subways/index.html?c=beijing
- 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)
<蚁群算法代码(求函数最值)>由会员分享,可在线阅读,更多相关<蚁群算法代码(求函数最值)(4页珍藏版)>请在人人文库网上搜索. 1.function F=F(x1,x2) % ...
- 利用Kuhn-Munkras算法求最小权值匹配
本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...
- 小A与欧拉路 (树加边求最小权值欧拉路+树的直径)
链接:https://ac.nowcoder.com/acm/contest/369/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 斗地主AI算法——第四章の权值定义
第一章业务逻辑结尾部分我提到了权值的计算方法: ①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样.③整手牌可以分成若干个组合牌,但分法不唯一. 当时,我说了① ...
- JQuery绘制北京地铁线路图
[img]http://dl.iteye.com/upload/attachment/0082/1655/8f4cb561-5ffe-3fd0-b39b-7ed895777d1b.jpg[/img]图 ...
- 2008北京地铁线路图
- 左神算法:求最大子矩阵的大小(Java版)
本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...
- RMQ算法,求区间最值
poj 3264 Balanced Lineup@ 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报 分类: RMQ(Range MinimumMaximum Quer)(4) ...
最新文章
- 生活随笔:保险公司来的电话
- PHP是弱类型语言,自动转换,强制转换
- 武汉专科计算机学校排名2015,武汉前十名的大专:2021武汉职校排名榜
- 信息系统项目管理师论文范文-风险管理
- 多文件同时读写为什么没有单文件读写快?
- VTK:绘图之Diagram
- android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码
- Dcmtk在PACS开发中的应用(基础篇) 第二章 打印影像(胶片) 作者 冷家锋
- yum方式安装android_在CentOS 7和Ubuntu14.04上安装Android Studio
- 【最小割】HDU 4971 A simple brute force problem.
- 我的JdbcUtils类
- Monitor线程同步
- Spark大数据系列教程持续更新
- linux文件怎么打包压缩文件,linux文件怎么打包、压缩和解压?详细教程来了!...
- I.Algorithm Choosing Mushrooms
- 2015 年度新增开源软件排名TOP100
- linux文件系统实现原理简述【转】
- 简介一些黑盒测试的方法
- Git远程仓库配置SSH(以github为例)
- 大学生用Python兼职五天狂赚1200,方法经验分享,让你早日实现财富自由
热门文章
- 解决Dependency ‘xxxx‘ not found
- php 正则过滤style,PHP 过滤常用标签的正则表达式
- html日期英文状态显示不出来,html 时间控件插件laydate, 显示时分,不显示秒
- 计算机组装与维修案例分析,计算机组装毕业论文
- 利用pickle保存模型
- 利用图基Tukey method检测数据集中的异常值
- 三十八、商业智能与ETL基础知识
- 什么叫计算机网络阻塞,计算机网络中的“线端阻塞”释义
- python实验三答案_20194123 实验三《Python程序设计》实验报告
- python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...