公交车线路查询系统

内容:
经过站
1路汽车:a,b,c,d..........
2路汽车:e,f,c,g.........
则从a-g需要在c站换车
怎么算?
$a = array('a','b','c','d');
$b = array('e','f','c','g');
print_r(array_intersect($a, $b));

数据库中保存每个线路经过的站名
检索出包含起点或终点的所有线路
则同时包含起点和终点的线路不需换乘
否则逐一检查两线路的交集
若还未找到,则沿经过起点的线路和经过终点的线路检查线路相交情况
一般城市都成承诺换乘次数小于等于3。所以计算到这里也就足够了

还可以一次性计算出任意两站间的换乘情况,将结果保存到库中。以后直接检索就行了


其实不用什么复杂的算法,只用SQL就可以完成了。可能你会担心效率问题,但是可以提前把结果计算出来存到数据库当中,甚至生成静态页面直接调用,这样速度比再好的算法也要快!呵呵
下面是从网上找来的例子:
-------------------------------------------------------------------
简单的东西,我不考虑怎么弄个好算法了,只是解决一下问题,能够得出结果即可:

三个表(最简单化,不考虑模糊查询,单行线等其他东西):
1,站点表 stop(stop_id,stop_name)
2,路线表 line(line_id,line_name)
3,路线站点表 linestops( line_id, stop_id, seq ) 此处的seq指某站点在某线路中的顺序。

现在分析算法:
1,直达。
首先根据两个站点名获取两个站点各自的id,这里定义为id1,id2
然后查询

selectline_idfrom
(
selectline_idfromlinestopswherestop_id=id1)A,
(
selectline_idfromlinestopswherestop_id=id2)B
whereA.line_id=B.line_id


即得到科直达的线路列表

2,一次换乘
首先根据两个站点名获取两个站点各自的id,这里定义为id1,id2
然后搜寻两个站点通过直达方式各自能够到达的站点集合,最后他们的交集就是我们所需要的换乘站点。

selectstop_idfrom
(
selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id1)
)A,
(
selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id1)
)B
whereA.stop_id=B.stop_id

得到换乘站(可能有多个或0个)后,剩下的就是显示能够到达换乘站的两边线路,这通过前面的直达查询即可。

3,二次换乘
首先根据两个站点名获取两个站点各自的id,这里定义为id1,id2
算法的中心思想是:站点1能够通过直达到达的所有站点集合A,站点2能够通过直达到达的所有站点集合B,A和B之间有直达的线路。
一步一步来:
站点1能够通过直达到达的所有站点集合A:

selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id1)

站点2能够通过直达到达的所有站点集合B:

selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id2)

而直达的查询是

selectline_idfrom
(
selectline_idfromlinestopswherestop_id=id1)C,
(
selectline_idfromlinestopswherestop_id=id2)D
whereC.line_id=D.line_id

我们把=id1和=id2换成 in (select ....)A 和 in (select ...)B

这样最后我们的查询是

selectline_idfrom
(
selectdistinctline_idfromlinestopswherestop_idin【A】)C,
(
selectdistinctline_idfromlinestopswherestop_idin【B】)D
whereC.line_id=D.line_id


其中【A】是

selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id1))

其中【B】是

selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id2))

这样子我们找到了作为中间换乘的线路(可能有多条或者0条),对列举的的每一条假设命名为X线,下一步就是找出可以从站点1到达X任意一个站点的直达线路、和可以从站点2到达X任意一个站点的直达线路即可。
那么与前面的算法相似,我们在站点1所有能够到达的站点中去寻找和线路X相交的站点,然后再去找这两个点的线路

selectstop_idfrom
(
selectdistinctstop_idfromlinestopswhereline_idin
(
selectline_idfromlinestopswherestop_id=id1))A,
(
selectstop_idfromlinestopswhereline_id=X)B
whereA.stop_id=B.stop_id

找到站点了,下面就是根据已经解决的直达查询找线路了。
站点2类似。


关于直达车,我是把整条线路存入一个字段,然后

SELECT*FROMLineWHERE(UpStopsLIKE'%'+@StopName+'%')OR(DownStopsLIKE'%'+@StopName+'%')
虽然有点XX,不过当时我数据库还没有把站点分离出来,是后来自己写了一个程序把这100多条线路分成Stop和LineStop表的,最后一看,妈啊,1000多个站点。幸亏当初脑子没发热,手工输入数据库
c++城市公交查询系统 1.设有一文件对象in_file,若在while循环中用in_file>> 每次从文件中得到一个字符串直到文件结束, 如果用in_file直接来判断文件是否结束, 则文件末的那个字符串会得到两次。 而用文件in_file.eof()来判断则会得到正确的结果。 2.用delete []释放字符串空间时,老是有问题, 其中的原因之一是你原来申请的空间不够大, 后来往这个空间中放了过多的内容以至越界, 这时候会发生运行时的错误。 3.把一个对象作为参数传给另一个对象的成员函数时, 程序不能正常结束,即系统删除对象时有问题; 而使用指针或者引用传递参数时不仅不会出现问题, 而且可以人为的删除对象。 我个人认为这很有可能是值传递的原因, 当把一个对象作为实参传给一个函数时,函数形参拷贝了实参的值, 这时,如果对象有指针成员,那么形参的指针成员的值和 实参的指针成员的值将完全一样, 即它们指向的是同一块内存,所以当函数调用结束的时候, 函数的形参将会被系统撤消, 这时,形参调用析构函数,释放用new动态申请的内存。在函数的外面, 作为实参的对象的指针成员其实已经被撤消了,所以当程序结束, 系统撤消这个对象时,这个对象又要调用析构函数来释放指针成员, 但这时指针其实已经指向了非法的空间,导致出错。 bus 文件夹的内容记录的是每条线路的信息,对应于bus 类。 每个文件以线路名称(即车名,忽略前面的k)命名。 每个文件的内容组织如下:(共分为6行,以回车键作为行结束标志) 第一行为“线路名称:#### ”,其中####用具体的线路名称代替; 第二行为“上行站点:####”。 第三行为“下行站点:####”。 第四行为“首班车时间:####”。 第五行为“末班车时间:####”。 第六行为“票价:####”。 注:若不分“上行站点”和“下行站点”, 则第二行为“站点名称:####”, 第三行为空行;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值