Căn bậc hai


21

Trong toán học, hoán vị σ của thứ tự n là một hàm tính toán từ các số nguyên 1 ... n sang chính nó. Danh sách này:

2 1 4 3

đại diện cho hoán vị σ sao cho σ (1) = 2, σ (2) = 1, σ (3) = 4 và σ (4) = 3.

Một căn bậc hai của một hoán vị σ là một hoán vị rằng, khi áp dụng cho bản thân, cho σ . Ví dụ, 2 1 4 3có căn bậc hai τ = 3 4 2 1.

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

τ ( τ (k)) = σ (k) cho tất cả 1≤k≤n.

Đầu vào

Một danh sách gồm n > 0 số nguyên, bao gồm từ 1 đến n , bao gồm một hoán vị. Hoán vị sẽ luôn có một căn bậc hai.

Bạn có thể sử dụng danh sách 0 ... n-1 thay vì miễn là đầu vào và đầu ra của bạn nhất quán.

Đầu ra

Căn bậc hai của hoán vị, cũng như một mảng.

Hạn chế

Thuật toán của bạn phải chạy trong thời gian đa thức trong n . Điều đó có nghĩa là bạn không thể lặp qua tất cả n ! hoán vị của n .

Bất kỳ nội dung được cho phép.

Các trường hợp thử nghiệm:

Lưu ý rằng nhiều đầu vào có nhiều đầu ra có thể.

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

Tôi có đúng không khi nói rằng để hoán vị có căn bậc hai thì nếu nó chứa n chu kỳ có độ dài m thì n chẵn hoặc m là số lẻ?
Neil

@Neil Vâng. Mặt khác, hoán vị có thể được biểu diễn dưới dạng số lần hoán đổi lẻ.
jimmy23013

À đúng, đó là một cách tốt hơn để đặt nó.
Neil

Câu trả lời:


4

Perl, 124 122 byte

Bao gồm +3 cho -alp

Chạy với hoán vị dựa trên 1 trên STDIN:

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

Độ phức tạp là O (n ^ 3)


Tại sao độ phức tạp O (n ^ 3)?
Máy

@CatsAreFluffy Vì đó là một chương trình ngu ngốc :-). Nó xem xét từng cặp phần tử (ngay cả khi đã được xử lý, O (n ^ 2)) và nén các chu kỳ của chúng lại với nhau (thậm chí không biết khi nào dừng, O (n)) sau đó kiểm tra xem đó có phải là chu trình thích hợp cho căn bậc hai không . Trong chương trình, bạn có thể thấy 3 vòng lặp lồng nhau thành 2 bản đồ và một
TonMedel 7/03/2016

Oh. Có ý nghĩa.
Máy

2

Toán học, 165 167 byte

Một chức năng không tên.

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

Bán vô chủ:

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

Phép thuật này có tác dụng gì?
Máy

1
@CatsAreFluffy nếu tôi hiểu chính xác mã bán không được mã hóa, nó phân chia hoán vị thành các chu kỳ, nhóm chúng theo chiều dài, sau đó cho các số lẻ, nó tăng chúng lên sức mạnh (độ dài + 1) / 2 trong khi đối với các mã chẵn ghép chúng lại và riff chúng lại với nhau. (Nếu các chu trình chẵn không thể được ghép nối thì phân vùng không có căn bậc hai.)
Neil

0

Prolog - 69 ký tự

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

Giải trình:

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
Tôi sẽ tưởng tượng điều này mất thời gian theo cấp số nhân.
frageum

Ô đung rôi. Tôi sẽ phải sửa nó.
AtnNn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.