【问题标题】:How to choose all possible combinations?如何选择所有可能的组合?
【发布时间】:2012-09-11 16:12:43
【问题描述】:

假设我们有如下的贷款用户列表:

  • 贷款1
  • 贷款2
  • 贷款3
  • ...
  • loan10

我们有可以接受 2 到 10 笔贷款的功能: function(loans)。 例如,以下是可能的:

  • function(loan1, loan2)
  • function(loan1, loan3)
  • function(loan1, loan4)
  • function(loan1, loan2, loan3)
  • function(loan1, loan2, loan4)
  • function(loan1, loan2, loan3, loan4, loan5, loan6, loan7, loan8, loan9, loan10)

如何编写代码以将所有可能的组合传递给该函数?

【问题讨论】:

  • 什么语言? function(nloans, *list_of_loans) 几乎可以使用任何语言。
  • @skjaidev 我认为该函数只处理特定金融应用程序的给定贷款(因此只有给定的输入贷款用于分析,例如信用评分)。我不认为他每次都意味着每笔贷款
  • @skjaidev 哦,我明白你现在的意思了,你的意思是他不知道如何接受可变输入,而我认为他的问题是指如何为预先存在的函数生成所有组合可变输入。 LA_ 澄清一下就好了
  • @skjaidev,我正在寻找算法,因为语言是特定于业务应用程序的。

标签: algorithm combinations


【解决方案1】:

RosettaCode,您已经实现了多种语言的生成组合,请自行选择。

【讨论】:

    【解决方案2】:

    这是我们如何在 ruby​​ 中做到这一点的:

    loans= ['loan1','loan2', ... , 'loan10']
    
    def my_function(loans)
      array_of_loan_combinations = (0..arr.length).to_a.combination(2).map{|i,j| arr[i...j]}
    
      array_of_loan_combinations.each do |combination|
        //do something
      end
    end
    

    打电话:

    my_function(loans);
    

    【讨论】:

    • 现在 ruby​​ 已经为数组提供了现成的方法,称为组合和映射。如果您使用的语言没有它们,您可以创建这些功能。查看ruby-doc.org/core-1.9.3/Array.html#method-i-combination 以了解组合和映射的作用,以便您可以使用等价物或拥有自己的实现
    【解决方案3】:

    我编写了一个类来处理处理二项式系数的常用函数,这是您的问题所属的问题类型。它执行以下任务:

    将任何 N 选择 K 的所有 K 索引以良好的格式输出到文件。 K-indexes 可以替换为更具描述性的字符串或字母。这种方法使得解决这类问题变得非常简单。

    将 K 索引转换为已排序二项式系数表中条目的正确索引。这种技术比依赖迭代的旧已发布技术快得多。它通过使用帕斯卡三角形固有的数学属性来做到这一点。我的论文谈到了这一点。我相信我是第一个发现并发布这项技术的人,但我可能是错的。

    将已排序二项式系数表中的索引转换为相应的 K 索引。我相信它可能比您找到的链接更快。

    使用 Mark Dominus 方法计算二项式系数,该方法不太可能溢出并且适用于较大的数字。

    该类是用 .NET C# 编写的,并提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用一个名为 InitTable 的 bool 值,当它为 true 时,将创建一个通用列表来保存要管理的对象。如果此值为 false,则不会创建表。无需创建表即可执行上述 4 种方法。提供访问器方法来访问表。

    有一个相关的测试类显示如何使用该类及其方法。它已经过 2 个案例的广泛测试,没有已知的错误。

    要了解此类并下载代码,请参阅制表二项式系数。

    将此类转换为您选择的语言应该不难。

    为了解决您的问题,您可能需要编写一个新的贷款函数,该函数将贷款对象数组作为输入,并使用 BinCoeff 类处理这些对象。在 C# 中,要获取每个唯一组合的贷款数组,可以使用如下示例代码:

    void LoanCombinations(Loan[] Loans)
    {
       // The Loans array contains all of the loan objects that need
       // to be handled.
       int LoansCount = Loans.Length;
       // Loop though all possible combinations of loan objects.
       // Start with 2 loan objects, then 3, 4, and so forth.
       for (int N = 2; N <= N; N++)
       {
          // Loop thru all the possible groups of combinations.
          for (int K = N - 1; K < N; K++)
          {
             // Create the bin coeff object required to get all
             // the combos for this N choose K combination.
             BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
             int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
             int[] KIndexes = new int[K];
             // Loop thru all the combinations for this N choose K.
             for (int Combo = 0; Combo < NumCombos; Combo++)
             {
                // Get the k-indexes for this combination, which in this case
                // are the indexes to each loan in Loans.
                BC.GetKIndexes(Loop, KIndexes);
                // Create a new array of Loan objects that correspond to
                // this combination group.
                Loan[] ComboLoans = new Loan[K];
                for (int Loop = 0; Loop < K; Loop++)
                   ComboLoans[Loop] = Loans[KIndexes[Loop]];
                // Call the ProcessLoans function with the loans to be processed.
                ProcessLoans(ComboLoans);
             }
          }
       }
    }
    

    我没有测试过上面的代码,但总的来说应该可以解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多