क्रमपरिवर्तन वर्गमूल


21

गणित में, एक क्रमचय σ आदेश के एन ... पूर्णांक 1 से एक द्विभाजित समारोह है n ही। यह सूची:

2 1 4 3

का प्रतिनिधित्व करता है क्रमचय σ ऐसी है कि σ (1) = 2, σ (2) = 1, σ (3) = 4, और σ (4) = 3।

क्रमपरिवर्तन की एक वर्गमूल σ के क्रमपरिवर्तन है कि, जब खुद के लिए आवेदन किया, देता है σ । उदाहरण के लिए, 2 1 4 3वर्गमूल है τ = 3 4 2 1

k           1 2 3 4
τ(k)        3 4 2 1
τ(τ(k))     2 1 4 3

क्योंकि τ ( τ (के)) = σ (के) सभी 1≤k≤n के लिए।

इनपुट

N > 0 पूर्णांकों की एक सूची , सभी 1 और n समावेशी के बीच , एक क्रमपरिवर्तन का प्रतिनिधित्व करती है। क्रमपरिवर्तन हमेशा एक वर्गमूल होगा।

जब तक आपके इनपुट और आउटपुट संगत हैं, तब तक आप 0 ... n-1 की सूची का उपयोग कर सकते हैं।

उत्पादन

क्रमपरिवर्तन की जड़, एक सरणी के रूप में भी।

प्रतिबंध

आपका एल्गोरिथ्म बहुपद में n में चलना चाहिए । इसका मतलब है कि आप सभी n के माध्यम से सिर्फ लूप नहीं कर सकते हैं ! क्रम n के क्रमपरिवर्तन n

किसी भी निर्माण की अनुमति है।

परीक्षण के मामलों:

ध्यान दें कि कई इनपुट में कई संभावित आउटपुट होते हैं।

2 1 4 3
3 4 2 1

1
1

3 1 2
2 3 1

8 3 9 1 5 4 10 13 2 12 6 11 7
12 9 2 10 5 7 4 11 3 1 13 8 6

13 7 12 8 10 2 3 11 1 4 5 6 9
9 8 5 2 12 4 11 7 13 6 3 10 1

क्या मैं यह कहने में सही रहूंगा कि एक वर्गमूल के लिए क्रमपरिवर्तन के लिए यदि उसमें लंबाई m के चक्र हैं तो n भी सम है या m विषम है?
नील

@ नील हां। अन्यथा क्रमपरिवर्तन को विषम संख्या में स्वैप के रूप में दर्शाया जा सकता है।
jimmy23013

आह हाँ, यह डालने का एक बेहतर तरीका है।
नील

जवाबों:


4

पर्ल, 124 122 बाइट्स

के लिए +3 शामिल है -alp

STDIN पर 1 आधारित क्रमपरिवर्तन के साथ चलाएं:

rootperm.pl <<< "8 3 9 1 5 4 10 13 2 12 6 11 7"

rootperm.pl:

map{//;@{$G[-1]^$_|$0{$_}}{0,@G}=(@G=map{($n+=$s{$_=$F[$_-1]}++)?():$_}(0+$',0+$_)x@F)x2,%s=$n=0for@F}@F;$_="@0{1..@F}"

जटिलता हे (n ^ 3)


जटिलता ओ (n ^ 3) क्यों है?
कैलकुलेटरफ्लीन

@CatsAreFluffy क्योंकि यह एक बेवकूफ कार्यक्रम है :-)। यह प्रत्येक जोड़ी के तत्वों (भले ही पहले से संभाला, O (n ^ 2)) पर विचार करता है और अपने चक्रों को एक साथ जोड़ देता है (यह भी नहीं जानते कि कब रोकना है, O (n)) तब जांचता है कि क्या एक वर्गमूल के लिए एक उचित चक्र होगा । कार्यक्रम में आप 3 नेस्टेड छोरों को 2 मानचित्रों के रूप में देख सकते हैं और एक
टोन हास्पेल

ओह। समझ में आता है।
कैलकुलेटर

2

गणितज्ञ, १६५ १६ by बाइट्स

एक अनाम फ़ंक्शन।

PermutationList[Cycles@Join[Riffle@@@#~(s=Select)~EvenQ@*(l=Length)~SortBy~l~Partition~2,#[[Mod[(#+1)/2Range@#,#,1]&@l@#]]&/@#~s~OddQ@*l]&@@PermutationCycles@#,l@#]&

अर्द्ध ungolfed:

PermutationList[
    Cycles@Join[
        Riffle@@@Partition[SortBy[Select[#,EvenQ@*Length],Length], 2],
        #[[Mod[(Length@#+1)/2Range@Length@#,Length@#,1]]]& /@ Select[#,OddQ@*Length]
    ]& @@ PermutationCycles @ #,
    Max@#
]&

यह काम किस जादू से होता है?
कैलक्यूलेटरफैनलाइन

1
@CatsAreFluffy अगर मैंने सेमी-अनऑल्फ़ॉल्ड कोड को सही तरीके से समझा है, तो यह चक्र में क्रमचय को विभाजित करता है, उन्हें लंबाई से समूह करता है, फिर विषम लोगों के लिए यह उन्हें शक्ति (लंबाई + 1) / 2 तक बढ़ा देता है जबकि सम-विषम के लिए उन्हें जोड़े और उन्हें एक साथ riffles। (यदि चक्रों को जोड़ा भी नहीं जा सकता है तो विभाजन का कोई वर्गमूल नहीं है।)
नील

0

प्रस्तावना - 69 वर्ण

p([],_,[]). p([H|T],B,[I|U]):-p(T,B,U),nth1(H,B,I). f(X,Y):-p(Y,Y,X).

स्पष्टीकरण:

permutate([], _, []).                 % An empty permutation is empty
permutate([X|Xs], List, [Y|Ys]) :-    % To permutate List
  permutate(Xs, List, Ys),            % Apply the rest of the permutation
  nth1(X, List, Y).                   % Y is the Xth element of List

root(Permutation, Root) :-            % The root of Permutation
  permutate(Root, Root, Permutation). % Applied to itself, is Permutation

3
मुझे लगता है कि यह घातीय समय लगेगा।
3

अरे हाँ। मुझे उसे ठीक करना होगा।
एटन नं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.