程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL與最短路徑算法

SQL與最短路徑算法

編輯:關於SqlServer

題目:空間有若干個點,每個點之間的聯系都是隨機的,現求任意一個點(設為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是較長的路徑。

各位大蝦有什麼絕招能在SQL裡實現這算法?

--如果全部建立雙向關聯,可以試試看下面的語句

declare @t table
(
id int,
f_id varchar(20)
)
insert into @t
select 5,'1,7,30,3' union all
select 7,'11,21,9,5,8' union all
select 11,'7,21,30' union all
select 21,'7,11,30,66' union all
select 30,'5,11,21,88,99'
--select * from @t
declare @start int
declare @end int
declare @node int
declare @count int
declare @result varchar(100)
set @count=0
set @start=5
set @end=11
set @result=''
declare @tmp table
(
id int,
f_id varchar(20),
step int
)
insert into @tmp select @start,'',@count
while @end not in (select id from @tmp)
begin
set @count=@count+1
insert into @tmp
select distinct a.id,a.f_id,@count from @t a,@tmp b where charindex(rtrim(b.id),a.f_id)>0 and a.id not in (select id from @tmp)
end
select @result=rtrim(@count)+':'+rtrim(@end)
while @count>1
begin
set @count=@count-1
select top 1 @end=id from @tmp where step=@count and charindex(rtrim(@end),f_id)>0
select @result=rtrim(@count)+':'+rtrim(@end)+'/'+@result
end
select @result='0:'+rtrim(@start)+'/'+@result
select @result

/*

0:5/1:7/2:11

*/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved