求替代循環算法

dreamyyuan 2006-06-26 03:25:52
數據結構表述如下:(<->相互替代的意思)
知道
A <-> B
A <-> C
如何查出B<->C
也可以這樣寫:
A <-> B
B <-> C
如何查出A<->C



...全文
985 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamyyuan 2006-06-27
  • 打赏
  • 举报
回复
還有一種是A(1)+B(1)<->C(1) ,A(1)+C(2)<->D(1),這種就更為復雜了(括號裡面是比例值)
dreamyyuan 2006-06-27
  • 打赏
  • 举报
回复

不是嵌套层数,是替代比例
其實我遇到的要來得更復雜,涉及到的還有機種的限制,
比如A<->B 有1,2兩個機種限制,A<->C有2,3兩個機種限制,那麼B<->C只能在機種2裡存在替代關係。
ElderBrother 2006-06-27
  • 打赏
  • 举报
回复
表里的1,2,3是否表示嵌套层数的含义?
如果是这个含义的话,可能比较难以维持。因为这个太容易变动了,并且是依赖其他记录变化而变化的。可能的话干用循环处理会好一点,虽然效率上有一点低(如果纪录数不是非常大的话是可以忽略的),@n可以复一个比实际嵌套层数大的值也不影响结果。

当然你的地盘你做主:) 呵呵。
dreamyyuan 2006-06-27
  • 打赏
  • 举报
回复
ElderBrother()多层嵌套替代解法應該已經差不多了,謝謝。
dreamyyuan 2006-06-27
  • 打赏
  • 举报
回复
對ElderBrother()的方法改進:
declare @a table(id1 char(1),r1 int,id2 char(2) ,r2 int )
insert into @a values ('A',1,'B',1)
insert into @a values ('A',1,'C',2)
insert into @a values ('A',2,'D',3)
insert into @a values ('A',2,'E',3)

select a.id2,a.r2,b.id2,b.r2
from @a a join @a b on a.id1=b.id1 and a.id2<>b.id2
union
select a.id1,a.r1,b.id1,b.r1
from @a a join @a b on a.id2=b.id2 and a.id1<>b.id1
union
select a.id2,a.r2,b.id1,b.r1
from @a a join @a b on a.id1=b.id2 and a.id2<>b.id1
union --这个也要加上
select a.id1,a.r1,b.id2,b.r2
from @a a join @a b on a.id2=b.id1 and a.id1<>b.id2
union
select a.id1,a.r1,c.id2,c.r2
from @a a join @a b on a.id2=b.id1 and a.id1<>b.id2 join @a c on b.id2=c.id1 and b.id1<>c.id2
union
select a.id2,a.r2,c.id1,c.r1
from @a a join @a b on a.id1=b.id2 and a.id2<>b.id1 join @a c on b.id1=c.id2 and b.id2<>c.id1
ElderBrother 2006-06-27
  • 打赏
  • 举报
回复
有多层嵌套替代解法:
declare @a table(id1 char(1),id2 char(2))
insert into @a values ('A','B')
insert into @a values ('B','C')
insert into @a values ('C','D')
insert into @a values ('D','E')
insert into @a values ('E','F')

select * into #temp1 from @a
declare @i int
declare @n int
set @i=1
set @n=4 --表示嵌套层数
while (@i<=@n) --
begin

insert into #temp1
select a.id2,b.id2
from #temp1 a join #temp1 b on a.id1=b.id1 and a.id2<>b.id2
union
select a.id1,b.id1
from #temp1 a join #temp1 b on a.id2=b.id2 and a.id1<>b.id1
union
select a.id2,b.id1
from #temp1 a join #temp1 b on a.id1=b.id2 and a.id2<>b.id1
union --这个也要加上
select a.id1,b.id2
from #temp1 a join #temp1 b on a.id2=b.id1 and a.id1<>b.id2

set @i=@i+1
end

select distinct * from #temp1 a
where not exists ( select 1 from @a where id1=a.id1 and id2=a.id2)
drop table #temp1
ElderBrother 2006-06-27
  • 打赏
  • 举报
回复
插入ED后结果是:
A E
B C
B D
C B
C D
D B
D C
D F
E A
E G
F D
G E

这里只是考虑了一层嵌套替换,如果多层的话就没有办法了。
如A-B B-C C-D D-E E-F 这样的话就找不出A-F了,除非把查询结果再当成输入顺环调用。就太复杂了。
dreamyyuan 2006-06-27
  • 打赏
  • 举报
回复
to:ElderBrother()

如果insert into @a values ('E','D')

結果不對
fcuandy 2006-06-26
  • 打赏
  • 举报
回复
没明白楼主意思,只有光看的份
simonhehe 2006-06-26
  • 打赏
  • 举报
回复
学习
hellowork 2006-06-26
  • 打赏
  • 举报
回复
关注
ElderBrother 2006-06-26
  • 打赏
  • 举报
回复
插入A,D后结果是:
B C
B D
C B
C D
D B
D C
E G
G E
dreamyyuan 2006-06-26
  • 打赏
  • 举报
回复
如果insert into @a values ('A','D')

結果呢?
ElderBrother 2006-06-26
  • 打赏
  • 举报
回复
再次更正:
declare @a table(id1 char(1),id2 char(2))
insert into @a values ('A','B')
insert into @a values ('A','C')
insert into @a values ('E','F')
insert into @a values ('F','G')

select a.id2,b.id2
from @a a join @a b on a.id1=b.id1 and a.id2<>b.id2
union

select a.id1,b.id1
from @a a join @a b on a.id2=b.id2 and a.id1<>b.id1

union

select a.id2,b.id1
from @a a join @a b on a.id1=b.id2 and a.id2<>b.id1


union --这个也要加上

select a.id1,b.id2
from @a a join @a b on a.id2=b.id1 and a.id1<>b.id2


id2 id2
---- ----
B C
C B
E G
G E
ElderBrother 2006-06-26
  • 打赏
  • 举报
回复
declare @a table(id1 char(1),id2 char(2))
insert into @a values ('A','B')
insert into @a values ('A','C')
insert into @a values ('E','F')
insert into @a values ('F','G')

select a.id2,b.id2
from @a a join @a b on a.id1=b.id1 and a.id2<>b.id2
union

select a.id2,b.id2
from @a a join @a b on a.id2=b.id2 and a.id1<>b.id1

union

select a.id2,b.id2
from @a a join @a b on a.id1=b.id2 and a.id2<>b.id1


union --这个也要加上

select a.id2,b.id2
from @a a join @a b on a.id2=b.id1 and a.id1<>b.id2
ElderBrother 2006-06-26
  • 打赏
  • 举报
回复
其实替代问题转化成表和相应sql,似乎可以这样处理

declare @a table(id1 char(1),id2 char(1)) --id1, id2 为可以替代id1

insert into @a values ('A','B')--B可以替代A
insert into @a values ('A','C')--C可以替代A
insert into @a values ('E','F')--F可以替代E
insert into @a values ('F','G')--G可以替代F


select a.id2,b.id2
from @a a join @a b on a.id1=b.id1 and a.id2<>b.id2
union

select a.id2,b.id2
from @a a join @a b on a.id2=b.id2 and a.id1<>b.id1

union

select a.id2,b.id2
from @a a join @a b on a.id1=b.id2 and a.id2<>b.id1

结果如下:
id2 id2
---- ----
B C
C B
G F
昵称被占用了 2006-06-26
  • 打赏
  • 举报
回复
和公交车不同,只要自己定义 统一代码 ,都转化到统一代码比较就可以了
昵称被占用了 2006-06-26
  • 打赏
  • 举报
回复
建立一个表

统一代码 通用代码
A B
A C

用户输入的用个函数转换

create function fn_tra(
@c varchar(20)
)
return varchar(20)
as
begin
declare @r varchar(20)
set @r=@c
if exists (select 1 from tablename where 统一代码=@c)
return @c
if exists (select 统一代码 from tablename where 通用代码=@c)
select @r=统一代码 from tablename where 通用代码=@c
return @r
end
go


zjcxc 元老 2006-06-26
  • 打赏
  • 举报
回复
数据库中直接处理这个似乎不太有效.
zjcxc 元老 2006-06-26
  • 打赏
  • 举报
回复
楼主的问题和这个帖子中的问题是类似, 相当于公交车换乘, 或者网格中结点之间的目录的搜索算法

http://community.csdn.net/Expert/topic/4837/4837582.xml?temp=.5694239
加载更多回复(9)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧