快速比较(50分)

  • 主题发起人 主题发起人 L.Ming
  • 开始时间 开始时间
L

L.Ming

Unregistered / Unconfirmed
GUEST, unregistred user!
说得有点笼统,不明白的提出来
N个数组(暂定,实际为N个动态)
A array[0..N-1] of integer;
B0 array of integer;
B1 array of integer;
B2 array of integer;
B3 array of integer;
B4 array of integer;
....
B(N-1) array of integer;
B数组为动态设定,上限不定的随机正数
N个数组的值,在当前数组当没有重复(即可以B0 = B1,但不可以B0[0] = B0[1])
如果A数组的N个值,都存在B数组内,并且没有重复(这个重复是说如果A[0] 存在于B0内,那A[0]就不能重复再用于B1,B2等等其他B的数组的比较,但B0一定至少要有一个A数组的数据),那函数为真.否则为假

加上一条件:A数组的上限不会超过10,B数组的上限不会超过100
 
你数组的数量如果不超过255个可以用集合,如果超过,可以用分段集合来操作,如果数组下标量太大,则只能循环了.
 
不要用到集合吧?数据来源来是用户输入的字符串,如果值为真,还要把数据再返回给用户的.
 
真的不明白
 
A array[0..N-1] of integer;
B0 array of integer;
B1 array of integer;
B2 array of integer;
B3 array of integer;
B4 array of integer;
但你的类型都是 integer 呀!
 
这个算法,我认为关键在于在Bn数组中查找A,如果要提高效率,建议排序Bn数组。用二分法进行查找。
应该很快!
 
to bmsr:我是转为整型写入数组的,我觉得整型运行应该比字符串快一点吧?[V]
to xiammy:能详细一点吗?
 
to bmsr:我是转为整型写入数组的,我觉得整型运行应该比字符串快一点吧?[V]
to xiammy:能详细一点吗?
 
这么说你处理的是输入的字符了. 哪你就可以用集合了, 集合运算实在cpu寄存器内完成数度是最快的.
我看你的相等的意思实际上就是集合相等的意思,不知道我理解正确不.
你的相等举例就是: B0[0]='1' B0[1]='2' B0[2]='3' |B1[0]='2' B1[1]='3' B2[2]='1' 这时 B0=B1 若是这种情况,用集合是最好不过了
 
干脆你别抽象化你的问题了,直接描述你的应用吧,感觉你抽象化的不太好,似乎反而复杂了.
 
to bmsr:关于部分商业性的事,公司不允许透漏.其实也是和你理解的差不多,能给我一个用集合的例子吗?
 
看不懂。。
 
集合也好,循环也好,大家也拿出来讨论一下呀。
 
你这问题如果不太注重效率的话,可以使用递归来判断,因为最直接的做法应该是N层(包括最外层的A数组)的FOR循环嵌套,所以精简程序应该是使用递归方式查找判断,简单示例为:
代码:
function Check:boolean;
var
  i:Integer;
begin
  Result:=True;
  for i:=0 to n-1 do
    Result:=Result and CheckDG(A[i],0);
end;

function CheckDG(iA:Integer;iBJS:Integer):boolean;
var
  i:Integer;
begin
  Result:=False;
  if iBJS>=N then
    Exit;
  for i:=Low(B[iBJS] to High(B[iBJS] do
    if B[iBJS][i]=iA then
    begin
      Result:=True;
      Exit;
    end;
  Result:= CheckDG(iA,iBJS+1);
end;
程序只是指明了一个方向,没有经过仔细推敲,同时两个函数应该可以合并为一个函数的。
 
另外,如果可能,最好是使用集合方式,这种不是最有效的方法。
 
集合的比较快,请大家给一个集合的例子.
 
后退
顶部