0

私は90のリストを持っており、リスト内の各要素は600のint配列です。次に、このリストで(int配列ではなく)順列を実行したい、つまり、この90要素のリストのすべての可能な一意の組み合わせを取得したい、要するに90!リスト。

私はkwCombinatorics図書館を利用しています。

これがコードです。

この例外は、最初のforeachステートメントでスローされます ArgumentOutOfRangeException-

値が最大許容値を超えています。

foreach(var row in new Permutation(image_matrix_90_600.Count).GetRows())
{         
    foreach(var mix in Permutation.Permute(row, image_matrix_90_600))
        {
            // code for saving the individual list to text. 
        }
}

彼女はhttp://kwcombinatorics.codeplex.com/からの例です

using Kw.Combinatorics;
using System;
using System.Collections.Generic;

namespace Kw.CombinatoricsExamples
{
    public class Furniture
    {
        private string name;
        public Furniture (string newName) { name = newName; }
        public override string ToString () { return name; }
    }

    public class Fruit
    {
        private string name;
        public Fruit (string newName) { name = newName; }
        public override string ToString () { return name; }
    }

    class PnExample03
    {
        static void Main ()
        {
            var things = new List<object>
            {
                new Fruit ("apple"),
                new Furniture ("bench"),
                new Furniture ("chair")
            };

            // Use permutations to get rearrangements of other objects:

            foreach (var row in new Permutation (things.Count).GetRows())
            {
                foreach (var mix in Permutation.Permute (row, things))
                    Console.Write ("{0} ", mix);
                    Console.WriteLine ();
            }
        }

        /* Output:

        apple bench chair
        apple chair bench
        bench apple chair
        bench chair apple
        chair apple bench
        chair bench apple

        */
    }
}
4

3 に答える 3

3

これはできません。

90!は約1.49*10^138です

どういうわけか1秒あたり10億の順列を処理できると仮定すると、これには4 * 10^1,120億年以上かかります。宇宙の現在の年齢の何倍も。

楽しむ!:)

于 2013-02-19T10:23:08.060 に答える
2

widthコンストラクターで使用されるパラメーターは、Permutation(int width)0から20までの値を取る可能性があります。おそらくimage_matrix_90_600.Count渡される値は90であり、それが例外を取得する理由です。

/// <summary>
/// Make a new <see cref="Permutation"/> from the supplied
/// <em>width</em> of <see cref="Rank"/> 0.
/// </summary>
/// <param name="width">Number of elements of new sequence.</param>
/// <example>
/// <code source="Examples\Permutation\PnExample01\PnExample01.cs" lang="cs" />
/// </example>
/// <exception cref="ArgumentOutOfRangeException">
/// When <em>width</em> is less than 0 or greater than 20.
/// </exception>
public Permutation (int width)
{
    if (width < 0)
        throw new ArgumentOutOfRangeException ("width", "Value is less than zero.");

    if (width > MaxWidth)
        throw new ArgumentOutOfRangeException ("width", "Value is greater than maximum allowed.");

    this.data = new int[width];
    for (int ei = 0; ei < width; ++ei)
        this.data[ei] = ei;

    this.rank = 0;
}
于 2013-02-19T10:23:52.357 に答える
0

KwCombinatoricsライブラリのXMLのドキュメントによると、PermuteメソッドArgumentOutOfRangeException はソースの長さがKw.Combinatorics.Permutation.Width未満の場合にスローします。

于 2013-02-19T10:15:44.657 に答える