いくつかのセットをしましょうA
(例1000, 1001, 1002, ..., 1999
)。
lessThan
いくつかの順序関係関数をしましょう(例(a lessThan b) <-> (a > b)
)。
要素を自然にマッピングする関数(逆関数を使用)をindex
作成します。index'
A
例:
index a = 2000 - a
index' n = 2000 - n
P(多項式時間)のすべての(またはある種の)ペアの関数を構築index
(および)する方法がありますか?index'
(A, lessThan)
よろしくお願いいたします。
編集済み:A
定義によって設定される可能性があります(たとえば、別の大きなサブセットの繰り返しを伴うすべての組み合わせ)。その場合、A
完全にトラバース可能であるとは想定できません(Pで)。
編集済み:もう1つの重要な例として、要素が時計回りに正方形に並べられAn
たセット(のような要素を含む)を次のように設定します。(x, y, p)
n X n
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
次に、各トリプレットAn
をBn = [1..n^2]
with O(1)
(多項式)にマップできます。
与えられた1つのAn
要素で。与えられた1つの要素で。index
Bn
O(1)
Bn
index'
An
O(1)
// Square perimeter; square x = 1, 2, 3, ...
Func<int, int, int> perimeter = ( x, n ) => 4 * ( n - 2 * x + 1 );
// Given main diagonal coordinates (1, 1), (2, 2), ... return cell number
Func<int, int, int> diagonalPos = ( x, n ) => -4 * x * x + ( 4 * n + 8 ) * x - 4 * n - 3;
// Given a number, return their square
Func<int, int, int> inSquare = ( z, n ) => (int) Math.Floor(n * 0.5 - 0.5 * Math.Sqrt(n * n - z + 1.0) + 1.0);
Func<int, int, Point> coords = ( z, n ) => {
var s = inSquare(z, n);
var l = perimeter(s, n) / 4; // length sub-square edge -1
var l2 = l + l;
var l3 = l2 + l;
var d = diagonalPos(s, n);
if( z <= d + l )
return new Point(s + z - d, s);
if( z <= d + l2 )
return new Point(s + l, s + z - d - l);
if( z <= d + l3 )
return new Point(s + d + l3 - z, s + l);
return new Point(s, s + d + l2 + l2 - z);
};
(「組み合わせ論的種」、「組み合わせ論的オブジェクトの順序付けられた構築」、「種」haskellパッケージなどについて読んだことがあります)