这个序列生成问题的名称是什么?任何意见?

时间:2010-03-09 17:07:49

标签: algorithm language-agnostic sequence

我需要迭代一个由数组 a i 定义的有序序列, i = 1 .. n ,其中 n 是每个序列元素的长度,每个 a i 指定输出序列中 i 位置的最大可能值。

示例:

  • a = {10,10,10}
    顺序:000001002,... 999(从000999的十进制数字)

    < / LI>
  • a =(2,3,2}
    顺序:000001010011020021100101110111120121

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

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

3 个答案:

答案 0 :(得分:7)

这是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;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果你正在使用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();
    } 
相关问题