SOS--数据结构及算法(100分)

  • 主题发起人 主题发起人 lemonloveyan
  • 开始时间 开始时间
我实现过一次,就是ERP中得多阶BOM问题,用递归实现,具体得代码不知放哪了,仔细想想,反正是用递归
思路是先查询直接子节点,子节点有下阶就递归。
 
[:(!][:(!]
兄弟,这是我在SQL SERVER 2000 中测试通过的存储过程:
CREATE PROCEDURE TEST
@ID VARCHAR(20)
AS
BEGIN
DELETE FROM B
--先插入第一层下节点:
INSERT INTO B SELECT ID,1 FROM A WHERE SJID = @ID
--然后用一个循环
WHILE (SELECT COUNT(*) FROM A INNER JOIN B ON A.SJID = B.ID AND FLAG = 1) > 0
BEGIN
INSERT INTO B SELECT A.ID,0 FROM A INNER JOIN B ON A.SJID = B.ID AND FLAG = 1
UPDATE B SET FLAG = 2 WHERE FLAG = 1
UPDATE B SET FLAG = 1 WHERE FLAG = 0
END
END

真不行?奇了怪了。
我自信我写的没错,所以没测试,你说不行是我不敢说什么。
现在我试过了,如果你还说不行,哪我只能[:(!][:(!][:(!]了!
 
[:(][:(]
我确实在SQL中老老实实建表、导入数据、建立存储过程,运行存储过程测试的。
我也不太喜欢编程的人想当然的。
当然如果你不会用SQL的话,那我就没办法了。
 
pyzfl取临时表确实是个好办法。
但不管怎么样都少不了递归查找。
我想可不可以在设计表时加一个标志字段,就不用这样一个劲找,直到找不到为止?[?]
 
CREATE Procedure Test1
@ID Varchar(20)
AS
BEGIN
Declare @lev int
Set @lev=1
Select Sjid,ID,@lev as lev into #temp From A where sjid=@id
While Exists(Select * from #temp Where lev=@lev)
Begin
insert into #temp select Sjid,id,@lev+1 from A where Sjid in (select id from #temp where lev=@lev)
Set @lev=@lev+1
End
Select * from #temp order by lev,Sjid,id
END
GO
 
两个字段构成自关联够键tree,类似于bom的吧,俺港写完
 
To pyzfl
你的方法不错,我可没有说不行啊,挺好的,就是要删除A表,要是另一个客户又
要访问,那怎么办?况且查询时很频繁的!!!
其实我用递归做了,问题就是我找到了最下级结束之后就没有办法返回其上级的下
一条纪录进行继续查找,请问那个大虾有这方面的经验,告诉小弟一下!!!
存储过程我也试试看,毕竟这个速度够快!
 
如果查询很频率,那你就在最好另外生成一个父子结点的对应表
在每生成或删除一条原始记录时就在这个对应表中加一条记录

查询时只查这个对应表就可以了。
(查询工作移动写操作时执行,值不值得这样就看你查询的频度了)

对于pyzfl的重写临时表法,我有一点经验,那就是在临时表中记录操作者的IP地址
删除时不用删除所有记录,只需要删除IP地址是操作者机器的记录,
这样就可以保证多人操作互不干涉
 
[8D][8D]
虽然说用递归是时髦一点,但效率决没有我这个办法快,为什么?
因为递归是每个节点处理一次,而我的方法是每一层处理一次,比较一下,差多少倍啊?
其实这个办法也可以用DELPHI实现的,不过没有存储过程快。
再一个,我没有说要删除A表啊,而是说删除B表中的原有记录啊。
你说的另一个客户访问问题,其实很简单,你在B表中加一个客户端标志字段就行了。灵活
应用嘛。
用递归?——出力不讨好,不说处理起来流程很复杂,而且效率也差很远的。
不知各位认为如何?
 
以目前的数据结构,我同意pyzfl的观点
如果在 delphi里写代码,以目前的数据结构每生成一个节点的所有子节点
都需要遍历所有的记录,效率实在不怎么样
 
如果是ORACLE数据库可以直接用查询来实现
Select level <,column_name> from <table_name>
connect by prior <id_name> = <uplevel_id_name>
start with <id_name> = '<value>' order by <id_name>
希望你能看懂。
如果不是ORACLE可以用递归算法来查找
 
[^]
当然最快的办法是重建表结构,处理起来没有这么麻烦,不过[red]最多层次数[/red]就有限制了.
两者之间各有利弊,根据实际需要取舍吧。
 
[8D][8D]
QuickSilver的用#临时表是更好的办法,不存在多用户冲突问题,不过下面这一句好象有点不
太合适(当然功能是实现了):
>> While Exists(Select * from #temp Where lev=@lev)
这一句是检测临时表中有没有@lev层的记录。这时如果条件成立,但A表中如没有下层记录
的话,是还要运行一遍的。这样是多循环了一层。
——有点吹毛求疵了。[:D][:D]
wangjiankang兄的ORACLE语句看不懂,主要是我不会用ORACLE,不知道真的行不行,有没有
测试过?如果真行的话,那么ORACLE就功能太强大了,应该抽时间学习。
 
谢谢各位大侠的帮忙,小弟已经做好了!
由于分数不多,只能按劳分配了!
 
to:pyzfl,ORACLE专家的话都不信?:)
真的很好用,我写的够清楚了,[]表示根据具体情况写的字段或表名,有问题可以给我发
MAIL:SOFTWARE@UNISTRONG.COM
 
不是不信,主要的我没用过ORACLE,所以不知道ORACLE的功能。这个功能你测试过吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部