当前位置:首页 > 个人杂谈 > 正文内容

从数组中取出n个元素的所有组合(递归delphi版)

作者: 葛屹肃 | 日期: 2018-11-09 | 分类: 个人杂谈

最近应朋友要求,做一个从数组中取出n个元素的所有组合,即类似于大乐透的选号功能,上网查了一下,有完整的算法,这就好办了,算法是c语言的,C语言也能看懂,但没有开发工具,最后根据代码与思路修改成Delphi版,经过测试,运行正常。

首先,感谢网友提供的算法,如果没有算法,估计要花费不少时间才能完成,也许运行效率也会相当低下,我所参照的算法网址为:https://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2473788.html

问题:

如数组为{1, 2, 3, 4, 5, 6},取3个元素的组合,我们的思维是:
取1、2,然后再分别取3,4,5,6;
取1、3,然后再分别取4,5,6;
……
取2、3,然后再分别取4,5,5;
……

算法的基本思路:

1、先从数组中A取出一个元素,然后再从余下的元素B中取出一个元素,然后又在余下的元素C中取出一个元素
2、按照数组索引从小到大依次取,避免重复
依照上面的递归原则,我们可以设计如下的算法,按照索引从小到大遍历。

而经过自己修改后的Delphi版源代码如下:

//L1:      原始数组
//start:   遍历起始位置
//L2:      保存结果数组
//count:  数组的索引值(与元素个数相等)
//NUM:    选取的元素个数
//arr_len:原始数组的长度
procedure TForm1.CompagesData(L1: TStringList; Start: integer;var L2: TStringList; count, NUM, arr_len: Integer);
var
i,j: Integer;
temp: string;
begin
for i:=Start to arr_len-count do
begin
L2.Strings[count-1] := L1.Strings[i];

if count – 1 = 0 then
begin
temp := ”;
for j:=NUM-1 downto 0 do
begin
temp := temp + ‘ ‘ + L2.Strings[j];
end;
UsesList.Add(temp);
end else
begin
CompagesData(L1, i + 1, L2, count – 1, NUM, arr_len);
end;
end;
end;

//调用
procedure TForm1.RzButton1Click(Sender: TObject);
begin
DataList.CommaText := ’01,02,03,04,05,06,07′;
TempList.CommaText := ’0,0,0,0,0,0′;
UsesList.Clear;
CompagesData(DataList, 0, TempList, 6, 6, DataList.Count);
RzMemo1.Lines := UsesList;
end;

 

试了下33个数字选6个数字进行组合,运行时间110秒,差不多2分钟,递归的算法效率就是高,100多万的数据2分钟内处理完毕。

从数组中取出n个元素的所有组合(递归delphi版)

总结:善于在网上找资料胜过自己苦思冥想,现在成熟的算法网上一般都能找到,建议大家碰到难题多上网找找资料。

版权声明:本文由〖葛屹肃〗发布,转载请注明出处!
文章链接:https://www.geyisu.com/434.html

  • 评论:(0)

已有 0 位网友发表了一针见血的评论,你还等什么?

◎欢迎大家参与讨论