数学・アルゴリズム得意民集まれ

■ このスレッドは過去ログ倉庫に格納されています
0001以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:39:53.774ID:HnSwITYj0
N個の整数からなる数列{a_i}があって、それを昇順にソートしたい
ただし、許される操作は「隣合うものをスワップする」事だけ
この時、最小の操作回数でソートするアルゴリズムは?

制約条件:
1≦N≦5*10^6
0≦a_i≦10^9


これは蟻本に載ってた問題の改題
アルゴリズムは思いついたんだけど、それが「操作回数最小」になることの証明ができない
0002以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:40:17.779ID:FzlXnVZF0
ググれ
0003以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:40:43.643ID:HnSwITYj0
ググって分かるものではない
0004以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:42:15.982ID:HnSwITYj0
ちなみにこのアルゴリズムの正解は、

要素のうち最大のものを取り、操作を繰り返して最後尾に持っていく
これを繰り返す
0005以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:42:58.889ID:HnSwITYj0
最小のものを先頭に持っていく、でもいいはず

これらがなぜ操作回数最小を達成するのか、誰か考えてくれ
0006以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:43:56.687ID:wjcDjUFrd
課題は自力でやろう
0007 警備員[Lv.18]
垢版 |
2024/05/26(日) 13:43:58.519ID:kRQbEyX/0
数列 {a_i} を昇順にソートする際に隣接する要素のスワップだけを許される操作で最小の操作回数を求める問題について、最小の操作回数でソートするアルゴリズムは **バブルソート** を利用することで実現できます。バブルソートは最小の操作回数を達成しますが、具体的には **転倒数 (inversion count)** を計算し、その数が最小のスワップ回数になります。

### 転倒数の定義とバブルソートの関係

転倒数とは、数列においてi < j かつ a_i > a_j となる組(i, j)の数です。転倒数はその数列をソートするために必要な最小のスワップ回数と一致します。バブルソートは隣接する要素をスワップすることで転倒数を一つずつ減らし、最終的に0にするアルゴリズムです。

### 転倒数の計算方法

転倒数を効率的に計算するためには、分割統治法(例えばマージソート)を使います。以下の手順で転倒数を計算します。

1. 数列を二つに分割します。
2. 各部分について再帰的に転倒数を計算します。
3. マージする際に転倒数を計算します。

### 証明のポイント

バブルソートが転倒数を1つずつ減らすことに注目すると、バブルソートは常に最小のスワップ回数で数列をソートすることができます。転倒数がその数列の最小スワップ回数を表すため、バブルソートを利用することは最適であると証明できます。

1. **転倒数とスワップ回数の関係**: 各スワップ操作は転倒数を1だけ減らします。
2. **最小のスワップ回数**: 転倒数が0になるまでのスワップ回数が最小のスワップ回数です。
3. **バブルソートの有効性**: バブルソートは逐次的に隣接する要素を比較・スワップするため、常に転倒数を1ずつ減らし、最小のスワップ回数で完了します。

このようにして、数列を隣接スワップのみで昇順にソートするための最小操作回数を求めることができます。
0008以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:44:28.923ID:jyVtJZRI0
隣同士でしか操作できないならそれくらいかかるよね
0009以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:45:54.918ID:CDi09Fmv0
バブルソートくらいググれば即出るだろ
0010以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:46:19.293ID:HnSwITYj0
これバブルソートなんだっけ
俺のバブルソートに対するイメージが違ったかも
0011以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:46:25.618ID:AIWPTshN0
お前のGPTはバブルソートを選んだか
おれのGPTはマージソートを出したわ
0012以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:53:27.563ID:HnSwITYj0
店頭数がソートに必要な最小回数と一致することはどうやって示せばいいんだろ
0013以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:54:17.047ID:HnSwITYj0
VIPにいた数学ガチ勢は退散しちまったのか
0014以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 13:56:30.045ID:AIWPTshN0
GPT4oに聞けば教えてくれるで
0015以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 14:01:12.507ID:HnSwITYj0
いや、よく考えたら簡単かも

題意の操作を1回行ったとき、転倒数の減少は最大でも1だから、任意のアルゴリズムについて操作回数は転倒数以上になる。
バブルソートは毎回の操作で必ず転倒数を1減少させるから、これが最適

QED
0016以下、5ちゃんねるからVIPがお送りします
垢版 |
2024/05/26(日) 14:01:25.503ID:HnSwITYj0
解決したわ
解散
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況