2012-12-20 62 views
0

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(多項式時間)?

最好的問候,並提前感謝!

EDITEDA可能是通過定義(例如與另一大子集的重複所有組合),那麼,我們不能假設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 

然後,我們可以映射在每個三元組AnBn = [1..n^2]O(1)(多項式)。

給定一個An元素我們可以indexBnO(1)。 給定一個Bn元素,我們可以index'AnO(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等)

+0

謝謝你的負面反饋,你是非常善良的不解釋我做錯了。 – josejuan

+0

集合是有限的嗎?只是爲了仔細檢查,這是可數的? –

+0

@尼古拉斯威爾遜,是的,你可以假設'A'是有限的且可數的(可枚舉的)。但是,可以構建(在某些情況下)訪問元素的「索引」函數嗎? (例如,在自然的身份,我的例子等...) – josejuan

回答

3

我可能會誤解你想要什麼,但如果我不是:

如果lessThan定義在設置的總訂單上,您可以創建indexindex'功能

  • 轉換設置爲一個列表(或陣列/載體)
  • 排序,根據lessThan
  • 構造index'Data.Map.fromDistinctAscList $ zip [1 .. ] sortedList
  • 構造indexData.Map.fromDistinctAscList $ zip (map NTC sortedList) [1 .. ]

其中NTC是NEWTYPE構造包裝元素的類型該集合的Ord實例由lessThan給出。

newtype Wrapped = NTC typeOfElements 

instance Eq Wrapped where 
    (NTC x) /= (NTC y) = x `lessThan` y || y `lessThan` x 
-- that can usually be done more efficiently 

instance Ord Wrapped where 
    (NTC x) <= (NTC y) = not $ y `lessThan` x 

EDITED:A可以是一組定義(如:與其他大集的重複所有組合),那麼,我們不能假設A是完全穿越(以P)。

在這種情況下,除非我錯過了基本的東西,否則原則上是不可能的,因爲index'函數將提供對該集合的完整遍歷。

因此,您可以在多項式時間內創建indexindex'函數,當且僅當該集合在多項式時間內可遍歷。

+0

你的haskell構建是非常好的,但(我的錯,對不起,我已編輯的問題)'A'可能無法在P中遍歷我的示例構造' index'(和'index''),而不用遍歷'A'。我已經通過'種類'包包含了#Haskell標籤。不管怎樣,謝謝你! – josejuan

+0

'index''將提供遍歷。所以你可以在多項式時間內構造它,當且僅當'A'在多項式時間內是可穿越的。 –

+0

原諒我糟糕的解釋,我添加了一個不平凡的例子,在某些情況下,我們可以構造'索引/索引''沒有遍歷集。 (一般情況下)我們可以在什麼情況下構建這些? – josejuan