【问题标题】:What is the name of this sequence generation problem? Any comments?这个序列生成问题的名称是什么?任何意见?
【发布时间】:2010-03-09 17:07:49
【问题描述】:

我需要遍历由数字数组定义的有序序列ai, i = 1..n,其中n是每个序列元素的长度,每个ai em> 指定输出序列中位置 i 处可能值的最大数量。

例子:

  • a = {10,10,10}
    序列:000,001,002,...999(从000到999的十进制数)

  • a = (2,3,2}
    序列:000,001,010,011,020,021,100,101,110,111,@9876 /p>

(注意:我不仅需要打印序列,还需要遍历其元素,其中每个元素都是一个数组,例如 {1,2,1}。)

在我实现这个之前,我想问一下是否有人有任何 cmets?也许这是一个已知问题(名称?),并且已经有代码可用,或者它简化为其他一些众所周知的问题?它确实与排列问题有相似之处。

【问题讨论】:

  • 您能进一步解释您的问题吗? {10,10,10} 应该输出 000 到 999 之间的数字吗?
  • {10,10,10} 为您提供了一个迭代器,其范围涵盖元素 {0,0,0}、{0,0,1}、{0,0,2}、. ..,{9,9,9}。 (每个元素都是一个数组。)

标签: algorithm language-agnostic sequence


【解决方案1】:

这是Cartesian product。

在 Python 中,itertools.product 生成这样的元组列表。

>>> import itertools
>>> list(itertools.product(*map(range, [2, 3, 2])))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (0, 2, 0), (0, 2, 1),
 (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), (1, 2, 0), (1, 2, 1)]

在其他语言中,使用嵌套循环很容易创建笛卡尔积:

for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
        for (int k = 0; k < 2; k++)
            cout << i << j << k << endl;

【讨论】:

  • 感谢您的名称和 python 代码。当然,对于其他语言,你不能只使用嵌套循环,因为它必须适用于所有 $n$,而不仅仅是适用于 $n=3$,所以我想必须使用递归。
  • @Frank Right。递归非常简单。
【解决方案2】:

序列的元素按字典顺序列出。另请参阅this(一个不同但相关的问题)。

【讨论】:

    【解决方案3】:

    如果你用的是C#(linq),笛卡尔积中的因子个数是静态的,那么也可以很优雅地表达

        static void Main(string[] args)
        {
            IEnumerable<int> firstFactor = Enumerable.Range(0, 2);
            IEnumerable<int> secondFactor = Enumerable.Range(0, 3);
    
            var cartesianProd =
                 from first in firstFactor
                 from second in secondFactor
                 select new { First = first, Second = second };
    
            foreach (var tuple in cartesianProd)
            {
                Console.WriteLine("({0}, {1})", tuple.First, tuple.Second);
            }
            Console.ReadLine();
        } 
    

    【讨论】:

      猜你喜欢
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2011-10-02
      • 2020-12-12
      • 2015-04-12
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多