2011-09-22 56 views
2

我們假設我們有一個類型的元素列表,其中x,y, 和z整數。並且,如果需要x < y < z。我們還假定列表包含至少3個這樣的三元組。在列表中搜索某些三元組

Mathematica能否輕鬆解決以下問題? 要檢測至少一個{a,b,.}{b,c,.}{a,c,.}類型的三元組? 我比高效計算解決方案更適合優雅的單線。

+5

我不完全理解你是什麼意思'檢測至少一個類型{a,b ,.},{b,c ,.}和{a,c ,.}的三元組? ' –

+2

請解釋「如果需要」中的「如果需要x DavidC

回答

1

要匹配 「類型{A,B ,.},{B,C ,.}和{A,C ,.}的」 三元:

list = {{34, 37, 8}, {74, 32, 65}, {48, 77, 18}, {77, 100, 30}, 
     {48, 100, 13}, {100, 94, 55}, {48, 94, 73}, {77, 28, 12}, 
     {90, 91, 51}, {34, 5, 32}}; 

Cases[Partition[list, 3, 1], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}}] 
3

如果我的理解這個問題,你想要檢測不一定跟隨另一個三元組,但通常在列表中的某處。這是檢測所有這些三元組的一種方法。首先,一些測試列表:

In[71]:= tst = RandomInteger[5,{10,3}] 
Out[71]= {{1,1,0},{1,3,5},{3,3,4},{1,2,1},{2,0,3},{2,5,1},{4,2,2}, 
      {4,3,4},{1,4,2},{4,4,3}} 

下面是代碼:

In[73]:= 
Apply[Join,ReplaceList[tst,{___,#1,___,#2,___,#3,___}:>{fst,sec,th}]&@@@ 
    Permutations[{fst:{a_,b_,_},sec:{b_,c_,_},th:{a_,c_,_}}]] 

Out[73]= {{{1,4,2},{4,3,4},{1,3,5}},{{1,4,2},{4,2,2},{1,2,1}}} 

這或許可以滿足你「的一行」的要求,但也不是很有效的。如果你只需要三倍以下彼此,然後,以替代由@克里斯給出的解決方案,你可以做

ReplaceList[list, 
    {___, seq : PatternSequence[{a_, b_, _}, {b_, c_, _}, {a_,c_, _}], ___} :> {seq}] 
0

編輯

(元組是不是要走的路)

你需要這樣的:

list = RandomInteger[10, {50, 3}]; 

Cases[Permutations[ 
    list, {3}], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}} /; a < b < c] 

{{{0, 1, 2}, {1, 5, 2}, {0, 5, 4}}, 
{{2, 3, 5},{3, 4, 10}, {2, 4, 5}}, 
{{6, 8, 10}, {8, 10, 10},{6, 10, 0}}, 
{{2, 4, 5}, {4, 8, 2}, {2, 8, 5}}, 
{{2, 4, 5}, {4, 7, 7}, {2, 7, 3}}, 
{{0, 2, 2}, {2, 7, 3}, {0, 7, 2}}, 
{{0, 2, 1}, {2, 7, 3}, {0, 7, 2}}} 

或者是(其它已經解釋的問題):

Cases[Permutations[ 
    list, {3}], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}}]; 
2

我不知道如果我正確地解釋你的問題,但假設你的列表是一樣的東西

list = Sort /@ RandomInteger[10, {20, 3}] 

(* 
{{3, 9, 9}, {0, 5, 6}, {3, 4, 8}, {4, 6, 10}, {3, 6, 9}, {1, 4, 8}, 
    {0, 6, 10}, {2, 9, 10}, {3, 5, 9}, {6, 7, 9}, {0, 9, 10}, {1, 7, 10}, 
    {4, 5, 10}, {0, 2, 5}, {0, 6, 7}, {1, 8, 10}, {1, 8, 10}} 
*) 

那麼你可以做類似

ReplaceList[Sort[list], 
{___, p:{a_, b_, _}, ___, q:{a_, c_, _}, ___, r:{b_, c_, _}, ___} :> {p, q, r}] 

(* Output: 
{{{0, 2, 5}, {0, 9, 10}, {2, 9, 10}}, {{3, 4, 8}, {3, 5, 9}, 
    {4, 5, 10}}, {{3, 4, 8}, {3, 6, 9}, {4, 6, 10}}} 
*) 

請注意,這是行得通的,因爲它給出了任何元素{x,y,z}在原始列表中我們有x<=y。因此,對於三重{{a,b,_}, {a,c,_}, {b,c,_}} \[Subset] list我們知道a<=b<=c。這意味着{a,b,_},{a,c,_}{b,c,_}這三個元素將以Sort[list]的順序出現。

+0

我沒有實現你的版本,因爲從OP的表述中不清楚條件(不平等)是否實際執行。除此之外,我不明白你的答案與我的不同。 –