【问题标题】:Libraries for ordered combinations generation and ranking? [closed]用于有序组合生成和排名的库? [关闭]
【发布时间】:2011-02-20 10:08:06
【问题描述】:

我正在寻找一个可以对有序组合进行排名/取消排名的库,其中排名意味着从一个组合中它为您提供来自格雷码或字典或其他算法的第 n 个组合,取消排名是逆向过程。

我正在寻找一个库来执行许多算法,例如格雷码、字典序、rev-lexicographic、enup 等。

如果它只生成,它也可以有很多算法。

我找到了 FXT 库,但它没有使用有序组合;它可以组合,但它似乎没有按照我的需要进行排名算法,它可以与排名/未排名的无序组合相媲美。

【问题讨论】:

    标签: c++ c combinations


    【解决方案1】:

    这并不能完全回答您的问题,但有一本关于这个主题的优秀书籍,名为 Combinatorial Algorithms: Generation, Enumeration, and Search

    在算法/数学方面和实际实现之间取得了很好的平衡。大多数示例都很简单,可以在很短的时间内用 C 等过程语言编写。

    【讨论】:

      【解决方案2】:

      你需要这样的东西吗:

      // get a combination of a rank
      // n number k choices N rank
      
      void unrankComb(int* &K, int n, int k, int N)
      {
       int e, N2, t, m, p;
      
       e = nCr(n,k);
       N2 = e-1-N;
       e = ((n - k)*e)/n;
       t = n - k + 1;
       m = k;
       p = n -1;
       do
       {
        if(e <= N2)
        {
         K[k-m] = n - t - m + 2;
         if(e > 0)
         {
          N2 = N2 -e;
          e = (e * m) / p;
         }
         m = m -1;
         p = p -1;
        }
        else
        {
         e = ((p - m)*e) / p;
         t = t - 1;
         p = p - 1;
        }
      
       }while(m != 0);
      }
      

      【讨论】:

      • 选择一个代码块并使用 ctrl-k 或 101 按钮对其进行格式化。
      猜你喜欢
      • 2015-10-28
      • 2012-12-02
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多