资源描述:
《sql与最短路径算法》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、SQL与最短路径算法>>教育资源库 题目:空间有若干个点,每个点之间的联系都是随机的,现求任意一个点(设为A)到另一任意点(设为Z)之间间隔最少其他点的最佳算法(可用SQL数据库) 约束:在一个点中只可以直接找出和它有直接联系的点 用途:通过朋友列表以最快的速度认识一个认识的人(MM/GG) 比如5的好友列表中有1,30,3 7的好友列表中有9,5,8 10的好友列表中有7,21,30 11的好友列表中有7,5,30 21的好友列表中有7,30,66 30的好友列表中有21,88,99 如果5要和7交朋友,则可通过5-11-7。而5-30-21-7是较长的路径。
2、 各位大虾有什么绝招能在SQL里实现这算法? --如果全部建立双向关联,可以试试看下面的语句declarettable(idint,f_idvarchar(20))insertintotselect5,'1,7,30,3'unionallselect7,'11,21,9,5,8'unionallselect11,'7,21,30'unionallselect21,'7,11,30,66'unionallselect30,'5,11,21,88,99'--select*fromtdeclarestarti
3、ntdeclareendintdeclarenodeintdeclarecountintdeclareresultvarchar(100)setcount=0setstart=5setend=11setresult=''declaretmptable(idint,f_idvarchar(20),stepint)insertintotmpselectstart,'',counttmp)beginsetcount=count+1insertintotmpselectdistincta.id,a.f_id,countfromta,tmpb(b.id),a.f
4、_id)>0anda.idnotin(selectidfromtmp)endselectresult=rtrim(count)+':'+rtrim(end)tmp(end),f_id)>0selectresult=rtrim(count)+':'+rtrim(end)+'/'+resultendselectresult='0:'+rtrim(start)+'/'+resultselectresult /* 0:5/1:7/2:11 */ 点评:上面的方法的缺点是不能列出所有的路径,只能
5、列出最短路径其中一条 5的列表中没有7,是不是可以认为5不认识7,那么5也不认识11,谈何5-11-7是最短路径? --按照你说的逻辑,步骤如下 --1.建立查询函数CREATE FUNCTIONdbo.F_RouteSearch(STARTINT,ENDINT)RETURNSVARCHAR(200)ASBEGINDECLARENODEINTDECLARECOUNTINTDECLARERESULTVARCHAR(100)SETCOUNT=0SETRESULT=''DECLARETMPTABLE(IDINT,F_IDVARCHAR(20),STEPINT)INSE
6、RTINTOTMPSELECTSTART,(SELECTF_IDFROMLISTTMP)BEGINSETCOUNT=COUNT+1INSERTINTOTMPSELECTDISTINCTa.ID,a.F_ID,COUNTFROMLista,TMPb(a.ID)+',',','+b.F_ID+',')>0anda.IDnotin(SELECTIDFROMTMP)IFRO(COUNT)+':'+RTRIM(END)TMPWHERESTEP=COUNTANDCHARINDEX('12下一页>>>>这篇文章来自..,
7、。,'+RTRIM(END)+',',','+F_ID+',')>0SELECTRESULT=RTRIM(COUNT)+':'+RTRIM(END)+'→'+RESULTENDSELECTRESULT='0:'+RTRIM(START)+'→'+RESULTRETURNHANDLE:RETURNRESULTEND