嵌套循环实现该功能,但速度慢的要死,寻求优选算法!!

[复制链接]
查看11 | 回复6 | 2021-1-27 06:56:28 | 显示全部楼层 |阅读模式
我想实现如下功能:有7组数据:
A:12345
B:45854
C:65892
D:458
E:245
F:2485
G:265
各组数据内容可以不固定,长度最多为10,最少1位,具体数据为0至9的数
要求A、B、C、D、E、F、G各组任意选择1个数字,组成7位数,列出所有的号码,一条条输出到valuelist中,以便可以相应过滤.
我用嵌套循环可以实现该功能,但速度慢的要死,与其他彩票软件相比速度差很多,有何良方?
我的算法(效率底下,别笑我...):
fori1:=1tolen(A)do
fori2:=1tolen(B)do
fori3:=1tolen(C)do
fori4:=1tolen(D)do
fori5:=1tolen(E)do
fori6:=1tolen(F)do
fori7:=1tolen(G)do
str:=A[i1]+B[i2]+C[i3]+D[i4]+E[i5]+F[i6]+G[i7];
最好用delphi编写 ,感谢!

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
就你提的问题本身而言,复杂度就是这样,性能上没法再优化了。
彩票中奖号码不是只要一组吗?生成那么多干嘛?你应该从根本上换一下思路。
回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
to楼上
我的要求很明确,要求A、B、C、D、E、F、G各组任意选择1个数字,组成7位数,列出所有的号码,一条条输出到valuelist中,以便可以相应过滤.不列出所有号码如何过滤?

回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
可以边生成边过滤,也就是说将过滤条件加入生成过程,那些会被滤掉的根本就不会输出到valuelist中。
不知道lz现在的究竟有多慢,按照lz给出的数据来看,不会超过10^7,这个量级的大概1秒之内就可以处理了。
另外,就从现在的程序上来看,也有可以优化的地方,delphi我不熟,不知道字符串的加法效率如何,
用char[]数组不知道会不会好一些。另外即使用现在的这种7重循环的方式(其实用混合进制实现,代码上更优雅一些),
也不用每次都将所有字符串加一遍,可以改成如下方式
fori1:=1tolen(A)do
str1:=A[i1];
fori2:=1tolen(B)do
str2:=str1+B[i2];
fori3:=1tolen(C)do
str3:=str2+C[i3];
fori4:=1tolen(D)do
str4:=str3+D[i4];
fori5:=1tolen(E)do
str5:=str4+E[i5];
fori6:=1tolen(F)do
str6:=str5+F[i6];
fori7:=1tolen(G)do
str7:=str6+G[i7];
这样字符串的加法,仅在进位时才做一次,也应该能提高一些效率,尽量将元素数量较多的组放在后面,进位次数会下降不少。
引用2楼nbyzzxd的回复:to楼上
我的要求很明确,要求A、B、C、D、E、F、G各组任意选择1个数字,组成7位数,列出所有的号码,一条条输出到valuelist中,以便可以相应过滤.不列出所有号码如何过滤?

回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
valuelist是个什么东西,如果是界面控件,不建议每条直接输出到它,先全部暂存到一个TStringList里,完成后再一次性赋值给valuelist
回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
恩,ls可能说到关键问题了,如果valuelist是一个类似listview的控件,那就难怪会慢了,
向控件添加大量数据,需要先打开类似批处理模式,否则每添加一条,都有可能触发某个事件(比如onAdd),
即使lz没有定义事件的处理,仅仅是判断事件是否有对应的委托,也会比较慢,那样的话1秒钟的事情处理个1分钟也不算新鲜.
引用4楼ahjoe的回复:valuelist是个什么东西,如果是界面控件,不建议每条直接输出到它,先全部暂存到一个TStringList里,完成后再一次性赋值给valuelist
回复

使用道具 举报

千问 | 2021-1-27 06:56:28 | 显示全部楼层
成了,上面2位说的很对,就是valuelist影响了速度,谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行