2013-04-16 66 views
17

鑑於輸入數組這個集合/數組操作有沒有名字?

和「加入」功能(a,b) => (a+b)

我的代碼返回陣列的以下數組,含有通過將連接功能的各種元素對,同時保持獲得的每個可能的變化順序:

[ 
    [a,b,c,d,e], 
    [a,b+c,d,e], 
    [a,b+c+d,e], 
    [a,b,c+d,e], 
    [a+b,c,d,e], 
    [a+b,c+d,e], 
    [a+b+c,d,e], 
    [a+b+c+d,e], 
    [a,b,c,d+e], 
    [a,b+c,d+e], 
    [a,b+c+d+e], 
    [a,b,c+d+e], 
    [a+b,c,d+e], 
    [a+b,c+d+e], 
    [a+b+c,d+e], 
    [a+b+c+d+e], 
] 

在視覺上,我想要做的是這樣的:

diagram of ordered partitions

該代碼有效,但我不知道該怎麼稱呼它 - 並且希望使用一個名稱,熟悉該操作的其他開發人員將會理解該名稱,如果存在這樣的名稱。這不是一個權力集,但它是類似的...這個特定的集合/數組操作有一個名字嗎?

編輯:好的。他們不是排列;排列將全部爲不同順序的5元素陣列[[a,b,c,d,e], [e,d,c,b,a], [a,d,b,c,e], ...]

它們不是分區,因爲任何子集只能包含輸入的相鄰元素。 - 換句話說,分區將允許這樣的:

diagram depicting partitions of non-adjacent elements

(這大概源於沒有一組有序的概念純集理論。)

他們不是因爲每個元素組合的輸出只使用輸入集的每個成員一次。

我認爲myArray.OrderedPartitions((a,b) => (a+b))可能是一個適當的簡潔和解釋性的。

+0

GetPermutations? – KingCronus

+1

爲什麼'[a + b + c + d + e]'缺失? – Landei

+0

@Landei我的錯誤:)編輯了這個問題,以包括缺失的排列。 –

回答

5

正如mbeckish在評論中說的那樣,那些集合(一旦原始集合上的一個訂單被固定)同構於依賴於順序的整數分區,顯然通常被稱爲compositions。每一組都有正確的組成。對於每1kn(n-1) choose (k-1) 元素組合(n-1) choose (k-1)組合k集合,保留您開始使用的集合的順序。爲了使其可視化,請考慮按順序放置的集合中的元素和按順序排列的鄰居元素之間的空格;把你的例子看作A|B|C|D|E。你會注意到有確切的n-1可能的邊界。要創建K組合,您只需要選擇k-1這些可能的邊框,這可能是也可能不是您生成套組的方式。總結所有(n-1) choose (k-1)k1n然後給我們2 n-1作爲可能的組成的數量。

+0

很好的解釋。值得補充的是,總和等於'2 ^(n-1)'。 – rliu

+0

@roliu補充說,感謝您的建議! –

+0

他們確實會出現成分。謝謝 :) –

1

[海報的主要編輯使我的回答過時,這是關於發佈的原始問題:] 整數序列的在線百科全書簡單地提到這些「間隔子集」。 (http://oeis.org/A000124) 我會堅持這一個,這是相當具有描述性的。

+0

我不會說它是描述它在做什麼(如果我看到名字我不知道我期望的功能是什麼 - 我可以看到這個名字如何適用於很多,但)。 – Chris

5

經過編輯 - 這些都是分區的一個數組(並且它們的計數是2 ^(n-1),因爲您可以用joiner(+)替換任何分隔符(冒號))。

注 - 這些是陣列分區,不是設置分區。

+0

它是2 ^(n-1),而不是2^n。 – ElKamina

+0

是的,固定..... – MBo

0

這是一個向樹從根節點分之遙:

enter image description here

要注意,你不聲明你的套重要的順序是非常重要的,只是爲了保持與各組。在Python代碼通過您的 「加盟」 產生你的 「分區」:

A = map(list, list('abcde')) 

def join(A): 
    B = [] 
    for x1,x2 in zip(A,A[1:]): 
     B.append((x1,x2,sorted(list(set(x1+x2))))) 
    return B 
def label(x): 
    return '+'.join(x) 

# Draw the graph with networkx 
import networkx as nx 
G = nx.DiGraph() 

while len(A)>1: 
    B = join(A) 
    for x1,x2,pair in B: 
     print label(x1), label(pair) 
     G.add_edge(label(x1),label(pair)) 
     G.add_edge(label(x2),label(pair)) 
    A = [x[2] for x in B] 

nx.write_dot(G,'test.dot') 

# Render the graph to an image 
import os 
os.system('dot -Tpng test.dot > test.png') 
0

如何myArray.possibleChainings()或myArray.possibleLinkings()?

這個想法是,它看起來像你鏈接或鏈接在一起至少 兩個要素。我覺得它也很直觀,因爲你不能鏈接或鏈接在一起的不是鄰居的元素。

相關問題