Permütasyon Karekökü


21

Matematik olarak, permütasyon σ düzenin n ... tamsayılar 1'den bijective fonksiyonudur n kendisi. Bu liste:

2 1 4 3

temsil permütasyon σ şekilde σ (1) 2, = σ (2) = 1, σ (3) 4 =, ve σ (4) 3 =.

Σ permütasyonunun kare kökü, kendisine uygulandığında σ veren bir permütasyondur . Örneğin, τ = 2 1 4 3karekökü vardır .3 4 2 1

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

çünkü τ ( τ (k)) = σ (k) hepsi 1≤k≤n için.

Giriş

Her biri 1 ile n arasında bir sayı olan n > 0 tamsayılı listesi, bir permütasyonu temsil eder. Permütasyon her zaman bir kare kökü içerecektir.

Giriş ve çıkışlarınız tutarlı olduğu sürece 0 ... n-1 listesini kullanabilirsiniz .

Çıktı

Permütasyonun karekökü, aynı zamanda bir dizi.

Kısıtlamalar

Algoritmanız n numaralı polinom zamanında çalışmalıdır . Bu, sadece n'in her yerine döngü yapamayacağınız anlamına gelir ! emri, permütasyon n .

Herhangi bir yapıya izin verilir.

Test durumları:

Birçok girişin birden fazla çıkışa sahip olduğunu unutmayı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

Bir karekök için bir permütasyon için m uzunluğunda n uzunlukları içeriyorsa, o zaman n'nin çift mi yoksa m nin tuhaf olduğunu söylemek doğru olur mu?
Neil

@Neil Evet. Aksi takdirde, permütasyon tek sayıda takas numarası olarak gösterilebilir.
jimmy23013

Ah evet, bunu koymak için çok daha iyi bir yol.
Neil

Yanıtlar:


4

Perl, 124 122 bayt

İçin +3 içerir -alp

STDIN'deki 1 tabanlı permütasyon ile çalıştırın:

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}"

Karmaşıklık O (n ^ 3)


Karmaşıklık neden O (n ^ 3)?
CalculatorFeline

@CatsAreFluffy Çünkü aptalca bir program :-). Her bir öğe çiftini göz önünde bulundurur (önceden ele alınmış olsa bile, O (n ^ 2)) ve döngülerini birlikte fermuarlar (ne zaman durması gerektiğini bile bilmeden, O (n)) daha sonra bunun karekök için uygun bir döngü olup olmadığını kontrol eder . Programda iç içe geçmiş 3 döngüyü 2 harita ve for olarak görebilirsiniz
Ton Hospel

Ah. Mantıklı.
Hesap MakinesiFeline

2

Mathematica, 165 167 bayt

Adsız bir işlev.

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

Yarı ungolfed:

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

Bu ne kadar büyülü çalışıyor?
Hesap MakinesiFeline

1
@CatsAreFluffy, yarı dallanmış kodu doğru anladıysam, permutasyonu döngülere böler, uzunluklarına göre gruplandırır, sonra tuhaf olanlar için güçlerini artırır (uzunluk + 1) / 2 onları çiftler ve onları birbirine karıştırır. (Çift çevrimler eşleştirilemiyorsa, bölmenin karekökü yoktur.)
Neil

0

Prolog - 69 karakter

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

Açıklama:

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
Bunun üssel zaman alacağını hayal ediyorum.
feersum

Ah, doğru. Bunu düzeltmem gerekecek.
AtnNn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.