讓A
某些集合(例如1000, 1001, 1002, ..., 1999
)。 (例如(a lessThan b) <-> (a > b)
)。有序集合和自然雙射(組合物種)
讓index
函數(與逆index'
)映射A
元素爲自然。
實施例:
index a = 2000 - a
index' n = 2000 - n
存在着一些方法來構建index
(和index'
)函數的所有(或一些種)(A, lessThan)
對在P(多項式時間)?
最好的問候,並提前感謝!
EDITED:A
可能是通過定義(例如與另一大子集的重複所有組合),那麼,我們不能假設A
設置是完全穿越(以P)。
EDITED:另一非簡單的例子,讓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);
};
(我看了一下 「組合物種」,"Ordered construction of combinatorial objects","species" haskell package等)
謝謝你的負面反饋,你是非常善良的不解釋我做錯了。 – josejuan
集合是有限的嗎?只是爲了仔細檢查,這是可數的? –
@尼古拉斯威爾遜,是的,你可以假設'A'是有限的且可數的(可枚舉的)。但是,可以構建(在某些情況下)訪問元素的「索引」函數嗎? (例如,在自然的身份,我的例子等...) – josejuan