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


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

    其中本人由于时间时间问题所以就写入了:昌平线,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

  • 相关阅读:
    C#自定义控件在添加引用后不显示在工具箱的解决方法
    DevExpress中SearchLookUpEdit用法总结
    div(固定宽度和不固定宽度)居中显示的方法总结
    php面向对象学习笔记
    在php中使用Memcache
    memcache的安装及管理
    使用Quartz.NET cron-like表达式
    SQL CHECK 约束&Case when 的使用方法
    IP地址地区信息查询API接口调用方法
    ASP使用webRequest实现跨域请求
  • 原文地址:https://www.cnblogs.com/chinhi/p/bejingsbwmap.html
Copyright © 2020-2023  润新知