让A
一些设置(例如1000, 1001, 1002, ..., 1999
)。
让lessThan
一些顺序关系函数(例如(a lessThan b) <-> (a > b)
)。
让index
一个函数(带有 inverse )将一个元素index'
映射到自然值。A
例子:
index a = 2000 - a
index' n = 2000 - n
是否存在某种方法来为P(多项式时间)中的所有(或某些种类的)对构造index
(和)函数?index'
(A, lessThan)
最好的问候和提前感谢!
EDITED:A
根据定义可能是一个集合(例如,所有组合与另一个大子集的重复),然后,我们不能假设A
它是完全可遍历的(在 P 中)。
编辑:另一个不平凡的例子,让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]
(O(1)
多项式)。
给定一个An
元素,我们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 包等)