CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

a b c d 四个数组,

楼主aflower()2001-02-22 23:04:00 在 Delphi / VCL组件开发及应用 提问

 
   
  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

相关问题

  • ★★★简单问题:字符串 A as B as C as D as E 如何分割成数组? ★★★
  • 把数组A中大于0的放在B中小于0的放在C中,怎么定义数组B和C啊???????
  • 求30以内所有满足a^2+b^2=c^2的整数组合。
  • 如何循环a b c d........?
  • C数组问题,送分!!!
  • C++有变长数组吗?
  • 数组的比较(C#)
  • a*c+b*d=a+b成立的条件?
  • 如何截取字符串"a /b /c /d /",得到a,b,c,d
  • 求助:已知数组A包含10个互不相等的整数,数组B包含15个互不相等的整数,试编写一程序,将既在A中出现又在B中出现的偶数存放在数组C中

关键词

  • 数据
  • 排序
  • 数组
  • arraynum
  • 统计
  • bbb
  • aaa
  • 中
  • array

得分解答快速导航

  • 帖主:aflower
  • Wingsun
  • nhgw
  • BCB
  • BCB
  • xzisgood

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo