生成数组数组的所有组合

问题描述 投票:0回答:1

我正在取消c#..

我有一个数组,可以增长到 30 个。

char[][] myArray = new char[][]{
 
        new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' },
    new char[] { '3', '2', '1' }
};

想要创建格式的所有组合

“3333333333333333 3333333333333332 3333333333333331 3333333333333323 3333333333333322 3333333333333321 3333333333333313 3333333333333312 3333333333333311 3333333333333233 3333333333333232 …………”

我应用了两种方法,第一:

var data=myArray.Aggregate((IEnumerable<string>)new[] { string.Empty }, (e, d) => e.SelectMany(_ => d, (a, b) => a + b)).ToList();
File.AppendAllText(@$"C:\test.txt", (String.Join(Environment.NewLine,data)));

在这个方法中,只要数组计数为 16,就可以非常快地生成序列。超过 16,我会遇到内存问题。

第二种方法是

var positions = from list1 in mainList
                from list2 in mainList
                from list3 in mainList
                from list4 in mainList
......
 select new
 {
     list1,
     list2,
     list3,
....

然后使用 32 个线程的并行 for 循环。 在第二种方法中,运行超过 24 小时后,循环仍在运行。

是否有另一种方法可以更快地完成此操作,而不会遇到内存问题......

c# sequence permutation
1个回答
0
投票

基本上有 1、2 和 3 作为可能值。所以它们看起来很像数字。让我们创建一个初始数组来将状态存储在某处:

char[] myArray = new char[]{
 
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
    '1',
};

让我们创建一个值数组:

char[] values = new char[] {'1', '2', '3'};

现在,让我们循环一下:

bool ended = false;
while (!ended) {
    bool done = false;
    int index = myArray.Length - 1;
    while ((!done) && (index >= 0)) {
        int valueIndex = values.IndexOf(myArray[index]);
        valueIndex = (valueIndex + 1) % values.Length;
        if ((valueIndex == 0) && (index == 0)) {
            ended = true;
            done = true;
        } else {
            myArray[index] = values[valueIndex];
            if (valueIndex == 0) {
                index--;
            } else {
                done = true;
                //output current state in the way you like
            }
        }
    }
}

我们基本上是在“递增”一个 3 基数,其中数组元素代表数字。

© www.soinside.com 2019 - 2024. All rights reserved.