【问题标题】:How to perform combinatoric task in C#如何在 C# 中执行组合任务
【发布时间】:2014-07-29 10:03:28
【问题描述】:

我有一个组合任务的问题。我想要一个可以处理这个数学计算的代码 48/5 = 1712304 (5! = 5*4*3*2*1 = 120 48*47*46*45*44 = 205476480 205476480/120 = 1712304)

这里有更多细节。 我有一个包含 48 个字符串的字符串数组。字符串的长度在 2 到 3 个字符之间。

string array[] = new string[]{"A1","1D","410" /*[....]*/}

我想将 5 个字符串组合在一起,并且我想对整个数组执行此操作,我最大的问题是一个组合字符串只允许包含 48 个字符串中的每个字符串一次。并且每个组合字符串必须是唯一的。

最后我需要一个包含 1712304 个字符串条目的列表,其长度必须在 10 到 15 位之间。例如,一个字符串可能看起来像“A11A4103E1T”。

回到数学上,我知道有 1712304 个组合选项,所以任何其他结果一定是错误的。这就是我的问题出现的地方。

我创建了以下代码但没有成功

        string[] siDigit = new string[iNumDigits];
        List<string> liste = new List<string>();
        const int iDigitBase = 48;
        const int iNumDigits = 5;

        for (int i = 0; i < 1712303; ++i)
        {
            int i2 = i;
            for (int i3 = 0; i3 < iNumDigits; ++i3)
            {
                siDigit[i3] = array[i2 % iDigitBase];
                i2 /= iDigitBase;
            }
            bool duplicate_free = siDigit.Distinct().Count() == siDigit.Length;
            if (duplicate_free == true)
            {
                liste.Add(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
                Console.Write(siDigit[0] + siDigit[1] + siDigit[2] + siDigit[3] + siDigit[4]);
                Console.WriteLine();
            }
        }

我得到的是在我的列表中减少条目的方式,我只得到 1317051 个条目并且不知道为什么。我找不到任何解决我的问题的方法,希望有人可以帮助我。

任何帮助将不胜感激。

P.S 在德国他们不教更好的英语:)

【问题讨论】:

  • 是否有没有包含在 sn-p 中的外部循环?如果没有,我看不出列表中怎么可能有超过 1712304 个项目。
  • 如果这不是需要您自己编写算法内容的作业,请使用像this one 这样的第三方库。请注意,您可能无法将结果一次全部存储在内存中。我链接的库为您提供了一个 IEnumerable,您可以一一列举。
  • 好吧,我编辑了我的帖子,我很困惑,以至于我没有意识到我对我的旧代码写了评论,很抱歉这个错误。因为我不再上学了,所以没有作业;)
  • 除非我错过了什么不只是string.Join(array.Distinct())
  • 我猜你错过了什么。因为我不想从现有数组或类似的东西中删除重复项。问题是我无法正确创建我的条目

标签: c# math calculator combinatorics


【解决方案1】:

我认为你的算法是错误的。

考虑 i 等于 0,i2 等于 0,所以 siDigit[i3](i3 = 0, 1, 2, 3 ,4) 是 array[0],duplicate_free 是 false。你输了一个。因此,您无法获取所有条目。

这是一个递归算法:

private static void GetCombination(ref List<string[]> list, string[] t, int n, int m, int[] b, int M)
{
    for (int i = n; i >= m; i--)
    {
        b[m - 1] = i - 1;
        if (m > 1)
        {
            GetCombination(ref list, t, i - 1, m - 1, b, M);
        }
        else
        {
            if (list == null)
            {
                list = new List<string[]>();
            }
            string[] temp = new string[M];
            for (int j = 0; j < b.Length; j++)
            {
                temp[j] = t[b[j]];
            }
            list.Add(temp);
        }
    }
}

public static List<string[]> GetCombination(string[] t, int n)
{
    if (t.Length < n)
    {
        return null;
    }
    int[] temp = new int[n];
    List<string[]> list = new List<string[]>();
    GetCombination(ref list, t, t.Length, n, temp, n);
    return list;
}

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多