公交车路线查询系统后台数据库设计--换乘算法改进与优化
转:http://www.cnblogs.com/lucc/archive/2009/03/03/1401863.html
在《查询算法》一文中已经实现了换乘算法,但是,使用存储过程InquiryT2查询从“东圃镇”到“车陂路口”的乘车路线时,发现居然用了5分钟才查找出结果,这样的效率显然不适合实际应用。因此,有必要对原有的换乘算法进行优化和改进。在本文中,将给出一种改进的换乘算法,相比原有的算法,改进后的算法功能更强,效率更优。
1. “压缩”RouteT0
假设RouteT0有以下几行
如下图所示,当查询S1到S4的二次换乘路线时,将会产生3×2×4=24个结果
从图中可以看出,第1段路线中的3条线路的起点和站点都相同(第2、3段路线也是如此),事实上,换乘查询中关心的是两个站点之间有无线路可通,而不关心是乘坐什么路线,因此,可以将RouteT0压缩为:
如下图所示,压缩后,查询结果有原来的24条合并1组
查询结果为:
那么,为什么要对视图RouteT0进行压缩呢,原因如下:
(1)RouteT0是原有换乘算法频繁使用的视图,因此,RouteT0的数据量直接影响到查询的效率,压缩RouteT0可以减少RouteT0的数据量,加速查询效率。
(2)压缩RouteT0后,将中转站点相同的路线合并为1组,加速了对结果集排序的速度。
2.视图GRouteT0
在数据库中,将使用GRouteT0来描述压缩的RouteT0,由于本文使用的数据库的关系图与《查询算法》中有所不同,在给出GRouteT0的代码前,先说明一下:
主要的改变是Stop_Route使用了整数型的RouteKey和StopKey引用Route和Stop,而不是用路线名和站点名。
GRouteT0定义如下:
create view GRouteT0 as select StartStopKey,EndStopKey,min(StopCount) as MinStopCount,max(StopCount) as MaxStopCount from RouteT0 group by StartStopKey,EndStopKey
注意,视图GRouteT0不仅有StartStopKey和EndStopKey列,还有MinStopCount列,MinStopCount是指从StartStop到EndStop的最短线路的站点数。例如:上述RouteT0对应的GRouteT0为:
3.二次查询算法
以下是二次换乘查询的存储过程GInquiryT2的代码,该存储过程使用了临时表来提高查询效率:
GInquiryT2 /* 查询站点@StartStops到站点@EndStops之间的二次换乘乘车路线,多个站点用'/'分开,结果以分组方式给出,如: exec InquiryT2 '站点1/站点2','站点3/站点4' */ CREATE proc GInquiryT2(@StartStops varchar(2048),@EndStops varchar(2048) ) as begindeclare @ss_tab table(StopKey int)declare @es_tab table(StopKey int)insert @ss_tab select distinct Stop.StopKey from dbo.SplitString(@StartStops,'/') sn,Stopwhere sn.Value=Stop.StopNameinsert @es_tab select distinct Stop.StopKey from dbo.SplitString(@EndStops,'/') sn,Stopwhere sn.Value=Stop.StopNameif(exists(select top 1 * from @ss_tab sst,@es_tab est where sst.StopKey=est.StopKey))beginraiserror ('起点集和终点集中含有相同的站点',16,1)returnenddeclare @stops table(StopKey int)insert @stops select StopKey from @ss_tabinsert @stops select StopKey from @es_tabprint '===================================================='print '筛选出第1段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第1段乘车路线,保存到临时表#R1中select *into #R1from GRouteT0where StartStopKey in (select StopKey from @ss_tab)and EndStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表#R1上创建索引create index index1 on #R1(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '筛选出第3段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第3段乘车路线,保存到临时表#R3中select *into #R3from GRouteT0where EndStopKey in (select StopKey from @es_tab)and StartStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表上创建索引create index index1 on #R3(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '筛选出第2段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第2段乘车路线,保存到临时表#R2中select *into #R2from GRouteT0where StartStopKey in (select EndStopKey from #R1)and EndStopKey in (Select StartStopKey from #R3)--在临时表上创建索引create clustered index index1 on #R2(StartStopKey,EndStopKey)create index index2 on #R2(EndStopKey,StartStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '二次换乘查询'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------二次换乘查询select ss.StopName as 起点,dbo.JoinRoute(res.StartStopKey,res.TransStopKey1) as 路线1,ts1.StopName as 中转站1,dbo.JoinRoute(res.TransStopKey1,res.TransStopKey2) as 路线2,ts2.StopName as 中转站2,dbo.JoinRoute(res.TransStopKey2,res.EndStopKey) as 路线3,es.StopName as 终点,MinStopCountfrom(--查询出站点数最少的10组路线select top 10r1.StartStopKey as StartStopKey,r2.StartStopKey as TransStopKey1,r2.EndStopKey as TransStopKey2,r3.EndStopKey as EndStopKey,(r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) as MinStopCountfrom #R1 r1,#R2 r2,#R3 r3where r1.EndStopKey=r2.StartStopKey and r2.EndStopKey=r3.StartStopKeyorder by (r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) asc)res,Stop ss,Stop es,Stop ts1,Stop ts2whereres.StartStopKey=ss.StopKey andres.EndStopKey=es.StopKey andres.TransStopKey1=ts1.StopKey andres.TransStopKey2=ts2.StopKey------------------------------------------------------------set statistics time offprint '====================================================' end
4.测试
(1) 测试环境
测试数据:广州市350条公交车路线
操作系统:Window XP SP2
数据库:SQL Server 2000 SP4 个人版
CPU:AMD Athlon(tm) 64 X2 Dual 2.4GHz
内存:2G
(2)选择用于测试的的站点
二次换乘查询的select语句使用的三张表#R1,#R2,#R3,因此,这三张表的数据量直接影响到二次换乘查询使用的时间:
显然,R1的数据量由起点决定,查询起始站点对应的#R1的数据量的SQL语句如下:
select Stop.StopName as '站点',count(StartStopKey) '#R1的数据量' from RouteT0 full join Stop on RouteT0.StartStopKey=Stop.StopKey group by Stop.StopName order by count(StartStopKey) desc
运行结果如下:
显然,但起点为“东圃镇”时,#R1的数据量最大,同理可得终点和#R3数据量关系如下:
因此,在仅考虑数据量的情况下,查询“东圃镇”到“车陂路口”所用的时间是最长的。在下文中,将使用“东圃镇”作为起点,“车陂路口”为终点对二次查询算法进行效率测试
(3)效率测试
测试语句如下:
exec GInquiryT2 '东圃镇','车陂路口'
测试结果:
查询结果如下:
输出如下:
==================================================== 筛选出第1段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 458 行)SQL Server 执行时间: CPU 时间 = 10 毫秒,耗费时间 = 10 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。 ==================================================== 筛选出第3段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 449 行)SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 9 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 1 毫秒,耗费时间 = 1 毫秒。SQL Server 执行时间: CPU 时间 = 15 毫秒,耗费时间 = 1 毫秒。 ==================================================== 筛选出第2段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 41644 行)SQL Server 执行时间: CPU 时间 = 825 毫秒,耗费时间 = 825 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 93 毫秒,耗费时间 = 98 毫秒。SQL Server 执行时间: CPU 时间 = 93 毫秒,耗费时间 = 98 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。SQL Server 执行时间: CPU 时间 = 73 毫秒,耗费时间 = 73 毫秒。SQL Server 执行时间: CPU 时间 = 79 毫秒,耗费时间 = 73 毫秒。 ==================================================== 二次换乘查询 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 10 行)SQL Server 执行时间: CPU 时间 = 140 毫秒,耗费时间 = 141 毫秒。
从消息窗口的信息可以看出,查询大概用了1秒
5.效率优化
用GInquiryT2查询“东圃镇”到“车陂路口”仅用了1秒钟,那么,还能不能再优化呢?仔细分析输出的结果,可发现查询时最耗时的并不是换乘查询语句(140ms),而是筛选出第2段查询路线的语句(825ms),如图所示:
那么有没有方法可以提高筛选第2段路线的效率呢?答案是肯定的。只需把GRouteT0改成实表,并创建索引就行了。修改成实表后,就不需要把第2段路线缓存到临时表#R2中,修改后的GInquiryT2(重命名为GInquiryT2_1)如下:
/* 查询站点@StartStops到站点@EndStops之间的二次换乘乘车路线,多个站点用'/'分开,结果以分组方式给出,如: exec GInquiryT2_1 '站点1/站点2','站点3/站点4' */ CREATE proc GInquiryT2_1(@StartStops varchar(2048),@EndStops varchar(2048) ) as begindeclare @ss_tab table(StopKey int)declare @es_tab table(StopKey int)insert @ss_tab select distinct Stop.StopKey from dbo.SplitString(@StartStops,'/') sn,Stopwhere sn.Value=Stop.StopNameinsert @es_tab select distinct Stop.StopKey from dbo.SplitString(@EndStops,'/') sn,Stopwhere sn.Value=Stop.StopNameif(exists(select top 1 * from @ss_tab sst,@es_tab est where sst.StopKey=est.StopKey))beginraiserror ('起点集和终点集中含有相同的站点',16,1)returnenddeclare @stops table(StopKey int)insert @stops select StopKey from @ss_tabinsert @stops select StopKey from @es_tabprint '===================================================='print '筛选出第1段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第1段乘车路线,保存到临时表#R1中select *into #R1from GRouteT0where StartStopKey in (select StopKey from @ss_tab)and EndStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表#R1上创建索引create index index1 on #R1(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '筛选出第3段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第3段乘车路线,保存到临时表#R3中select *into #R3from GRouteT0where EndStopKey in (select StopKey from @es_tab)and StartStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表上创建索引create index index1 on #R3(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '二次换乘查询'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------二次换乘查询select ss.StopName as 起点,dbo.JoinRoute(res.StartStopKey,res.TransStopKey1) as 路线1,ts1.StopName as 中转站1,dbo.JoinRoute(res.TransStopKey1,res.TransStopKey2) as 路线2,ts2.StopName as 中转站2,dbo.JoinRoute(res.TransStopKey2,res.EndStopKey) as 路线3,es.StopName as 终点,MinStopCountfrom(--查询出站点数最少的10组路线select top 10r1.StartStopKey as StartStopKey,r2.StartStopKey as TransStopKey1,r2.EndStopKey as TransStopKey2,r3.EndStopKey as EndStopKey,(r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) as MinStopCountfrom #R1 r1,GRouteT0 r2,#R3 r3where r1.EndStopKey=r2.StartStopKey and r2.EndStopKey=r3.StartStopKeyorder by (r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) asc)res,Stop ss,Stop es,Stop ts1,Stop ts2whereres.StartStopKey=ss.StopKey andres.EndStopKey=es.StopKey andres.TransStopKey1=ts1.StopKey andres.TransStopKey2=ts2.StopKey------------------------------------------------------------set statistics time offprint '====================================================' end
下面,仍然用查询“东圃镇”到“车陂路口”为例测试改成实表后GInquiryT2的效率,测试语句如下:
exec GInquiryT2_1 '东圃镇','车陂路口'
消息窗口输出如下:
==================================================== 筛选出第1段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 458 行)SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。 ==================================================== 筛选出第3段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 449 行)SQL Server 执行时间: CPU 时间 = 6 毫秒,耗费时间 = 6 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。 ==================================================== 二次换乘查询 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 10 行)SQL Server 执行时间: CPU 时间 = 250 毫秒,耗费时间 = 253 毫秒。 ====================================================
从输出可以看出,大概用了250ms
6.展开路线组
GInquiryT2查询给出的结果是10组最短路线,那么,怎样才能得到最短的10条路线,显然,只需将这10组路线展开即可(展开后的路线数>=10),而最短的10条路线必然在展开的结果中。查询10条最短路线的存储过程GInquiryT2_Expand如下:
CREATE proc GInquiryT2_Expand(@StartStops varchar(2048),@EndStops varchar(2048) ) as begindeclare @ss_tab table(StopKey int)declare @es_tab table(StopKey int)insert @ss_tab select distinct Stop.StopKey from dbo.SplitString(@StartStops,'/') sn,Stopwhere sn.Value=Stop.StopNameinsert @es_tab select distinct Stop.StopKey from dbo.SplitString(@EndStops,'/') sn,Stopwhere sn.Value=Stop.StopNameif(exists(select top 1 * from @ss_tab sst,@es_tab est where sst.StopKey=est.StopKey))beginraiserror ('起点集和终点集中含有相同的站点',16,1)returnenddeclare @stops table(StopKey int)insert @stops select StopKey from @ss_tabinsert @stops select StopKey from @es_tabprint '===================================================='print '筛选出第1段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第1段乘车路线,保存到临时表#R1中select *into #R1from GRouteT0where StartStopKey in (select StopKey from @ss_tab)and EndStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表#R1上创建索引create index index1 on #R1(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '筛选出第3段乘车路线'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------筛选出第3段乘车路线,保存到临时表#R3中select *into #R3from GRouteT0where EndStopKey in (select StopKey from @es_tab)and StartStopKey not in (Select StopKey from @stops)order by StartStopKey,EndStopKey--在临时表上创建索引create index index1 on #R3(StartStopKey,EndStopKey)------------------------------------------------------------set statistics time offprint '===================================================='print '二次换乘查询'print '----------------------------------------------------'set statistics time on--------------------------------------------------------------二次换乘查询select ss.StopName as 起点,r1.RouteName as '路线 1',ts1.StopName as 中转站1,r2.RouteName as '路线 2',ts2.StopName as 中转站2,r3.RouteName as '路线 3',es.StopName as 终点, res.StopCount as 总站点数from(--展开最优 10 组路线 得到最短 10 条路线select top 10res.StartStopKey as StartStopKey,rt1.RouteKey as RouteKey_SS_TS1,res.TransStopKey1 as TransStopKey1,rt2.RouteKey as RouteKey_TS1_TS2,res.TransStopKey2 as TransStopKey2,rt3.RouteKey as RouteKey_TS2_ES,res.EndStopKey as EndStopkey,(rt1.StopCount+rt2.StopCount+rt3.StopCount) as StopCountfrom(--查询出站点数最少的 10 组路线select top 10r1.StartStopKey as StartStopKey,r2.StartStopKey as TransStopKey1,r2.EndStopKey as TransStopKey2,r3.EndStopKey as EndStopKey,(r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) as MinStopCountfrom #R1 r1,GRouteT0 r2,#R3 r3where r1.EndStopKey=r2.StartStopKey and r2.EndStopKey=r3.StartStopKeyorder by (r1.MinStopCount+r2.MinStopCount+r3.MinStopCount) asc)res,RouteT0 rt1,RouteT0 rt2,RouteT0 rt3where rt1.StartStopKey=res.StartStopKey and rt1.EndStopKey=res.TransStopKey1 andrt2.StartStopKey=res.TransStopKey1 and rt2.EndStopKey=res.TransStopKey2 andrt3.StartStopKey=res.TransStopKey2 and rt3.EndStopKey=res.EndStopKeyorder by (rt1.StopCount+rt2.StopCount+rt3.StopCount) asc)resleft join Stop ss on res.StartStopKey=ss.StopKeyleft join Stop es on res.EndStopKey=es.StopKeyleft join Stop ts1 on res.TransStopKey1=ts1.StopKeyleft join Stop ts2 on res.TransStopKey2=ts2.StopKeyleft join Route r1 on res.RouteKey_SS_TS1=r1.RouteKeyleft join Route r2 on res.RouteKey_TS1_TS2=r2.RouteKeyleft join Route r3 on res.RouteKey_TS2_ES=r3.RouteKey------------------------------------------------------------set statistics time offprint '====================================================' end
下面,仍然以查询“东圃镇”到“车陂路口”为例测试GInquiryT2_Expand,代码如下:
exec GInquiryT2_Expand '东圃镇','车陂路口'
查询结果如下:
消息窗口输出如下:
==================================================== 筛选出第1段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 458 行)SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 3 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。 ==================================================== 筛选出第3段乘车路线 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 449 行)SQL Server 执行时间: CPU 时间 = 6 毫秒,耗费时间 = 6 毫秒。 SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 1 毫秒。 ==================================================== 二次换乘查询 ----------------------------------------------------SQL Server 执行时间: CPU 时间 = 0 毫秒,耗费时间 = 0 毫秒。(所影响的行数为 10 行)SQL Server 执行时间: CPU 时间 = 282 毫秒,耗费时间 = 301 毫秒。 ====================================================
由输出结果可看出,大约用了300ms
7.总结
下面,对本文使用的优化策略做一下总结:
(1)使用临时表;
(2)将频繁使用的视图改为表;
(3)从实际出发,合并RouteT0中类似的行,从而“压缩”RouteT0的数据量,减少查询生成的结果,提高查询和排序效率。
公交车路线查询系统后台数据库设计--换乘算法改进与优化相关推荐
- php 公交 查询系统,php定做单城市公交路线查询系统
本人通过调查乌鲁木齐市的公交状况,发现使用公交路线查询系统的人群主要是两大人群:城市居民和公交管理员.而城市居民想要的功能是:可以查找车次,可以查找经过改站点的公交车,两站的换乘以及对公交车站提意见. ...
- 1、微信点餐系统之数据库设计
1.微信点餐系统之数据库设计 ---- ----商品表格 ---- CREATE TABLE `product_info` (`product_id` VARCHAR(32) NOT NULL COM ...
- MySQL数据库设计作业 ——《网上书店系统》数据库设计实验报告
数据库设计作业--<网上书店系统>数据库设计 一.功能需求 普通用户:可以进行最基础的登陆操作,可浏览图书.按类别查询图书.查看 图书的详细信息,还可以注册成为会员. 会员:需要填写详细信 ...
- 网上外卖及订餐系统的数据库设计
2019独角兽企业重金招聘Python工程师标准>>> 背景:互联网越来越发达,宅男越来越宅,网上订餐送叫外卖的越来越多. 注:本文仅做后台数据库设计,不做系统功能设计. 一.数据库 ...
- 关于电子支付系统的数据库设计
现在,大到银行等金额机构,小到城市一卡通,直到餐馆等路边小店的会员系统都在使用电子支付进行结算. 根据系统应用的用户规模和交易量,系统的数据库设计也是不同的. 那种账户一年才几个,交易量不到一万笔,交 ...
- 公交线路图查询系统c语言,公交路线查询系统(基于数据结构和C语言)完整
公交路线查询系统(基于数据结构和C语言)完整 #include #include #include #include #define max 30 #define len 20 #define MAX ...
- 数据结构课程设计大作业——江大公交路线查询系统
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 代码 总结 前言 参考资料[C++期末大作业]数据结构课设 | 智能公交车查询系统_米莱虾的博客-CSDN博客_c++期末大 ...
- 考试系统mysql数据库设计_《在线考试系统数据库设计与实现》.doc
网上测试系统 PAGE28 / NUMPAGES29 西南财经大学 Southwestern University of Finance and Economics 课程实验报告 课程名称: 数据库 ...
- C语言最短时间旅游路线查询系统,基于QT实现的旅游路线查询系统
一.功能要求 系统初始的城市总数不少于10个 建立汽车.火车和飞机的时刻表(航班表),时刻表(航班表)中包含沿途到站及票价信息 不能太简单(不能总只是1班车次相连),旅客的要求包括:起点.终点.途经某 ...
最新文章
- 利用Attribute简化Unity框架IOC注入
- python处理流程-Python文件处理流程
- 僵尸进程孤儿进程与守护进程
- 限制 计算机中 某用户上网 win7,Win7旗舰版怎么限制孩子的上网时间?电脑限制孩子上网时间的方法...
- mysql创建存储过程及遍历查询结果,mysql 用存储过程遍历结果集
- js拦截全局ajax请求
- 在word中插入分页符,多出一行
- 2021年终总结与展望
- SAP创建供应商及采购订单
- 老生常谈之防止刷新重复提交表单。
- ios-关于使用高德地图api心得(1)
- 地图标记(学习笔记)
- H5实现一键复制微信并打开微信跳转好友添加页
- 匹兹堡大学申请条件计算机科学,匹兹堡大学工程学院计算机科学专业申请条件...
- 我的理想200字计算机工程师,我的理想:工程师
- 数据挖掘实验(二):主成分分析PCA R语言
- Java构造之builder模式
- 谷歌,迎来最坏的时刻?
- 5.3 Python图像处理之图像编码-算术编码
- 波士顿动力机器人解锁跑酷新技能,凭借感知驱动技术适应技能