#author("2022-12-03T15:33:11+00:00","","")
*[[Problem 524:https://projecteuler.net/problem=524]] 「初めてのソート その2」 [#e4252aa6]

リストをソートする以下のアルゴリズムについて考えよう:

+ リストの1番目からスタートし, 順番に隣り合った要素のペアをチェックしていく.
+ もし隣り合った要素が順番通りでなければ:~
a. リストの1番目にそのペアの小さい方の要素を移動する.~
b. ステップ1から作業を再開する.
+ 全てのペアが順番通りになった時, 停止する.

例えば, リスト { 4 1 3 2 } は以下のようにしてソートされる:

>
%%%4 1%%% 3 2 (4 と 1 が順番どおりでないのでリストの1番目に 1 を移動する)~
1 %%%4 3%%% 2 (4 と 3 が順番どおりでないのでリストの1番目に 3 を移動する)~
%%%3 1%%% 4 2 (3 と 1 が順番どおりでないのでリストの1番目に 1 を移動する)~
1 3 %%%4 2%%% (4 と 2 が順番どおりでないのでリストの1番目に 2 を移動する)~
%%%2 1%%% 3 4 (2 と 1 が順番どおりでないのでリストの1番目に 1 を移動する)~
1 2 3 4 (これでリストはソートされた)
<

リスト '''L''' をソートする際に実行されるステップ 2a の回数を '''F'''('''L''') としよう. 例えば, '''F'''({ 4 1 3 2}) = 5 となる.

整数 {1, 2, ..., '''n'''} のすべての順列 '''P''' を''辞書式順序''で並べ上げ, それぞれの順列に対してリストの位置に対応した 1 から '''n'''! までのインデックス '''I'''&sub{'''n'''};('''P''') を割り当てることができる.
整数 {1, 2, ..., '''n'''} のすべての順列 '''P''' を''辞書式順序''で並べ上げ, それぞれの順列に対してリストの位置に対応した 1 から '''n'''! までのインデックス &tex{I_{n}(P)};を割り当てることができる.

この「初めてのソート」でソートするとちょうど '''k''' 回のステップが必要な最初の順列の位置を '''Q'''('''n''', '''k''') としよう, すなわち '''Q'''('''n''', '''k''') = min('''I'''&sub{n};('''P''')) for ('''F'''('''P''') = '''k'''). もし '''F'''('''P''') = '''k''' となる順列がない場合, '''Q'''('''n''', '''k''') は未定義となる.
この「初めてのソート」でソートするとちょうど '''k''' 回のステップが必要な最初の順列の位置を '''Q'''('''n''', '''k''') としよう, すなわち '''Q'''('''n''', '''k''') = min('''I'''&tex{_{n}};('''P''')) for ('''F'''('''P''') = '''k'''). もし '''F'''('''P''') = '''k''' となる順列がない場合, '''Q'''('''n''', '''k''') は未定義となる.

'''n''' = 4 の場合:~

|CENTER:|RIGHT:|RIGHT:|CENTER:|c
|'' '''P''' ''|'' '''I'''&sub{4};('''P''') ''|'' '''F'''('''P''') ''||
|'' '''P''' ''|'' '''I'''&tex{_{4}};('''P''') ''|'' '''F'''('''P''') ''||
|{1, 2, 3, 4}|1|0|Q(4, 0) = 1|
|{1, 2, 4, 3}|2|4|Q(4, 4) = 2|
|{1, 3, 2, 4}|3|2|Q(4, 2) = 3|
|{1, 3, 4, 2}|4|2||
|{1, 4, 2, 3}|5|6|Q(4, 6) = 5|
|{1, 4, 3, 2}|6|4||
|{2, 1, 3, 4}|7|1|Q(4, 1) = 7|
|{2, 1, 4, 3}|8|5|Q(4, 5) = 8|
|{2, 3, 1, 4}|9|1||
|{2, 3, 4, 1}|10|1||
|{2, 4, 1, 3}|11|5||
|{2, 4, 3, 1}|12|3|Q(4, 3) = 12|
|{3, 1, 2, 4}|13|3||
|{3, 1, 4, 2}|14|3||
|{3, 2, 1, 4}|15|2||
|{3, 2, 4, 1}|16|2||
|{3, 4, 1, 2}|17|3||
|{3, 4, 2, 1}|18|2||
|{4, 1, 2, 3}|19|7|Q(4, 7) = 19|
|{4, 1, 3, 2}|20|5||
|{4, 2, 1, 3}|21|6||
|{4, 2, 3, 1}|22|4||
|{4, 3, 1, 2}|23|4||
|{4, 3, 2, 1}|24|3||

任意の '''k''' に対し, '''Q'''('''n''', '''k''') が定義できるようなすべての '''n''' を検討した場合, 最小となる '''Q'''('''n''', '''k''') を '''R'''('''k''') としよう.

'''R'''(12&sup{12};) を求めよ.
'''R'''(12&tex{^{12}};) を求めよ.


// 誤訳?
// Let R(k) = min(Q(n, k)) over all n for which Q(n, k) is defined.
// 全てのnとk=12^12についてQ(n,k)を検討しその中でQ(n,k)が一番小さくなる数字を答えよ。

IP:112.68.65.182 TIME:"2022-12-04 (日) 00:33:11" REFERER:"http://odz.sakura.ne.jp/projecteuler/" USER_AGENT:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS