算法(100分)

  • 主题发起人 主题发起人 C.g.Lee
  • 开始时间 开始时间
C

C.g.Lee

Unregistered / Unconfirmed
GUEST, unregistred user!
我愿意出100分来得到高效率的算法:
在MRP中,经常会遇到递归算法,
例如:字段PItemId,ItemId分别表示某产品的父产品的Id,产品的Id.
请问该入口为一个ItemId,出口为该产品的所有的半成品和原材料ItemId!
注意:如果用到查询,只允许用一次或很少的次数,在递归中是不
允许查询的!
还有,在大学时没有将算法学好,请问各位大虾指点一下提高写算法的
捷径,是否有好的书籍!谢谢!
 
大虾们,快加油!
第一次可以将PItemId,ItemId数据放入动态二维数组中!
再进行数据处理得到需要的数据!
那位来拿分!
 
原材料是不是根?
放到二维数组里倒是可以, 但需要的是全部的,?

在数据库中, 我不会。
 
这个问题用单纯的递归可能无法办到,其实只要有这种递归的思路还是可以实现的。

下面是我在自已开发的MRP展料程序中所用到的算法,列出仅供参考:

Procedure mrp;
var
a:array of string;
i,j:integer;
begin
setlength(a,50);//可根据自己的实际情况设定动态数组长度。
for i:=0 to 49
a:='None'//赋值主要是为了下面的循环。
i:=0;
j:=1;
a[0]:=fieldvalues['ITemId'];//或者让a[0]等于您要查找的ItemId号;

//下段为主循环,主要为了取出其半成品或材料代号
while a<>'None' do
begin
table.filTER:=PItemId + '=' + ''''+ a + '''';//设定过滤条件为: 父产品的值为a
table.Filtered:=true;
table.First;
while not table.eof do
begin
a[j]:=table.fieldvalues['Itemid'];
if table.fieldvalues['type']='半成品' then
listbox1.items.add(a[j]+' 半成品')
else
listbox1.items.add(a[j]+' 材料');
j:=j+1;
table.next;
end;
i:=i+1;
end;

end;
以上代码,您只要修改一下,应该可满足您的需求。

如果您想学习算法您可以看一看,全国程序员考试用的教材<<程序设计>>一书,or
有名的<<数据结构>>书,

如果不出意外的话,您是不是应该给小弟分了。
 
看他的意思好象用的是 query, 用 table 当然简单了,
难的是 query 怎么结合???
 
Use Query and Use Table

应该没什么区别吧!
 
table 包含所有的记录, query 查询,
如果记录多的话, query 很慢,并且如果不是找出全部记录的话,
中间还是要查询的,这也就是他所说的问题。
 
哎,问题看不大太懂。
书:数据结构
程序设计技巧(vol1,vol2)
算法+数据结构=程序
 
sea713 Or Others:
Thank you!But...
但是我的想法是可以将一个表的数据直接放入动态数组,因为
是二个Id,所以将Table All Record 直接倒入动态数组即可。
再操作动态数组,得到正确的结果,考虑通用性,就不需要的对
数据判断'半成品','材料'了!
注意:PItemId,ItemId均为整型!
(我认为:Table——》DynArray——》数据处理——》结果)
会是一个很高效的算法!也许不用递归算法!也不会消耗服务
器很多的资源!
快继续加油!
 
不知C.g.Lee 兄的意思到底是什么,不过以小弟认为,小弟的算法应该说是比较的省时间,最起码,C.g.lee兄,把数据导入数组中花的也是时间,何况,当记录数上千上万时真不会有影响?

不管怎么说,小弟也利用了动态数组实现了一下,只是不知是否符合您的想法,还请C.g.Lee 兄和各位过目:

//在程序首部先声明一个动态两维数组:a,再声明一个过程Search(i:integer);


procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
setlength(a,table1.RecordCount,2);
table1.First;
i:=0;
while not table1.Eof do
begin
a[i,0]:=table1.Fields[0].value;
a[i,1]:=table1.Fields[1].value;
table1.Next;
i:=i+1;
end;//以上将数据导入数组;
search(strtoint(edit1.text));//查询的值为Edit1中输入的数值;
end;

//以下过程以递归形式找出所有值;
procedure TForm1.search(s:integer);
var i:integer;
begin
i:=0;
while i<table1.RecordCount do
begin
if a[i,0]=s then
begin
listbox1.Items.Add(inttostr(a[i,1]));//将值输出至listbox1;
search(a[i,1]);
end;
i:=i+1;
end;
end;

//此程序,小弟已在D5下经过调试,应无问题。
 
不好意思,竟然断线了,小弟继续贴了:

//以下过程以递归形式找出所有值;
procedure TForm1.search(s:integer);
var i:integer;
begin
i:=0;
while i<table1.RecordCount do
begin
if a[i,0]=s then
begin
listbox1.Items.Add(inttostr(a[i,1]));//将值输出至listbox1;
search(a[i,1]);
end;
i:=i+1;
end;
end;

//此程序,小弟已在D5下经过调试,应无问题。
 

看了半天你们的讨论,什么“递归算法”、“动态数组”
简直就是走火入魔,烦烦烦。其实,要实现
“请问该入口为一个ItemId,
出口为该产品的所有的半成品和原材料ItemId”
这样的查询。

我“一行代码都不用!哪用优化。”

用主从表:
主表:该产品ItemId。
从表:该产品(用ItemId关联)的所有的半成品和原材料ItemId......

如果我理解错了题目,大家接着讨论“递归算法”、“动态数组”。
否则没有人的方法比我的简单了。


 
如果你用Oracle,就太简单了!
 
呵呵, 不仅仅如此,我还有半成品的半成品, 算不算,
如果把 table 的数据倒入数组的话,很简单,就不用查询了,
他的意思不太明确,比方说成品是汽车,中间有好多种
半成品,原料是钢材,呵呵,仅仅举个例子。
 
sea713:
请将断线的数据贴上来!
Thanks To All!
C.g.Lee
 
EMail一个例子给你,希望有用。
 
没想到又断线了, 重新贴过.
//在程序首部先声明一个动态两维数组:a,再声明一个过程Search(i:integer);


procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
setlength(a,table1.RecordCount,2);
table1.First;
i:=0;
while not table1.Eof do
begin
a[i,0]:=table1.Fields[0].value;
a[i,1]:=table1.Fields[1].value;
table1.Next;
i:=i+1;
end;//以上将数据导入数组;
search(strtoint(edit1.text));//查询的值为Edit1中输入的数值;
end;

//以下过程以递归形式找出所有值;
procedure TForm1.search(s:integer);
var i:integer;
begin
i:=0;
while i<table1.RecordCount do
begin
if a[i,0]=s then
begin
listbox1.Items.Add(inttostr(a[i,1]));//将值输出至listbox1;
search(a[i,1]);
end;
i:=i+1;
end;
end;

//此程序,小弟已在D5下经过调试,应无问题。
 
奇怪,怎么老是贴不全,不会是大富翁的Bug吧!

//以下过程以递归形式找出所有值;
procedure TForm1.search(s:integer);
var i:integer;
begin
i:=0;
while i<table1.RecordCount do
begin
if a[i,0]=s then
begin
listbox1.Items.Add(inttostr(a[i,1]));//将值输出至listbox1;
search(a[i,1]);
end;
i:=i+1;
end;
end;

//此程序,小弟已在D5下经过调试,应无问题。

 
再贴:
while i<table1.RecordCount do
begin
if a[i,0]=s then
begin
listbox1.Items.Add(inttostr(a[i,1]));//将值输出至listbox1;
search(a[i,1]);
end;
i:=i+1;
end;
end;

//此程序,小弟已在D5下经过调试,应无问题。
再贴不上,我就不知怎么办了.
 
后退
顶部