a b c d 四个数组,
a b c d 四个数组,
Const
arraynum = 100000;
Var
a: Array[0..arraynum] Of String;
b: Array[0..arraynum] Of String;
c: Array[0..arraynum] Of integer;
d: Array[0..arraynum] Of integer;
a中数据 c中数据
ddd 5
aaa 1
bbb 3
aaa 2
bbb 1
ccc 4
需要得到
b中数据 d中数据
aaa 3
bbb 4
ccc 4
ddd 5
在变量files 约等于7万的情况下,我用下面的程序算b,d花了5分钟,
可是以后可能超过50万。
For i:=0 To files Do
Begin
flag:=false;
j:=0;
While j <= i Do
Begin
If a[i] = b[j] Then
Begin
num:=j;
flag:=true;
End;
j:=j + 1;
End;
If flag = false Then
Begin
b[k]:=a[i];
d[k]:=c[i];
inc(k);
End
Else
d[num]:=d[num] + c[i];
End;
QuickSort(d, b, 0, k - 1);
//快速排序
Procedure QuickSort(Var A: Array Of Integer; Var b: Array Of String; iLo, iHi: Integer);
Var
Lo, Hi, Mid, T: Integer;
tt: String;
Begin
Lo:=iLo;
Hi:=iHi;
Mid:=A[(Lo + Hi) Div 2];
Repeat
While A[Lo] < Mid Do
Inc(Lo);
While A[Hi] > Mid Do
Dec(Hi);
If Lo <= Hi Then
Begin
T:=A[Lo];
A[Lo]:=A[Hi];
A[Hi]:=T;
Tt:=b[Lo];
b[Lo]:=b[Hi];
b[Hi]:=Tt;
Inc(Lo);
Dec(Hi);
End;
Until Lo > Hi;
If Hi > iLo Then QuickSort(A, b, iLo, Hi);
If Lo < iHi Then QuickSort(A, b, Lo, iHi);
End;
现在要求1分钟解决战斗,请给一个好的算法。
不考虑内存占用,快就行。
如果用数据库作大概要多长时间?相应的SQL语句如何写?
问题点数:83、回复次数:6Top
1 楼Wingsun(孙春阳)回复于 2001-02-23 00:46:00 得分 20
数据库的话应该很快了(相对比较而言吧) SQL 语句如下:
Select a,Sum(c) As d From Table Group By a
具体的时间要看数据库的不同了。
你的程序应该还有办法可以优化的。
比如b,d你可以用TStringList来存储,因为TStringList支持一种访问的方式在你的程序中就很与用处,也就是它可以把一个名字(Name)和一个值联系起来(字符串类型)的,而且可以通过名字找到这个值,程序可以改成这样的:
Const
arraynum = 100000;
Var
a: Array[0..arraynum] Of String;
c: Array[0..arraynum] Of integer;
slDest:TStringList;//代替了b,d
//首先初始化slDest的Strings[i]="0"
For i:=0 To files Do
Begin
slDest.Values[a[i]]:=IntToStr(StrToInt(slDest.Values[a[i]])+c[i]);
End;
slDest.Sort;//或者通过别的方法来排序.
Top
2 楼nhgw(创新!)回复于 2001-02-23 01:32:00 得分 20
由于数据库是有索引的,所以用SQL求和和排序肯定可以快很多!不过50万条数据的处理应该至少要几分钟。
上面的SQL语句少排序部分。
Select a,Sum(c) As d From Table Group By a order by a
Top
3 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-23 08:43:00 得分 20
实际是分类统计;若用DELPHI直接统计,
需要一个好的动态查找算法(long2(N)),如树型结构,同时自动排序,
这是减少时间的关键;
1。对每一个(a,c)-->在树中查找->有:累加;没有:插入;
2。将统计好的树-->生成数组(b,d)
Top
4 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2001-02-23 08:51:00 得分 20
这50万数据是惊人,其实组织数据时,就要考虑以后的统计、检索;
比如,数据积累过程中就将数据排序好;不要到了要统计时,才做
这些排序的基本工作,若统计一次也要排序一次,效率就低了;
Top
5 楼xzisgood(夏)回复于 2001-02-23 08:59:00 得分 3
同意:BCB(yhec@china.com)Top
6 楼aflower()回复于 2001-02-23 10:24:00 得分 0
这么看来,还是要用数据库了
Top




