第 12 回 日本情報オリンピック本選 5 バブルソート1 問題...

34
12 日本情報オリンピック本選 問題5 バブルソート 秋葉 拓哉 / @iwiwi (東京大学 情報理工学系研究科) 2013/02/09 国立オリンピック記念青少年総合センター

Upload: others

Post on 27-Sep-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

第 12 回 日本情報オリンピック本選 問題5

バブルソート

秋葉 拓哉 / @iwiwi (東京大学 情報理工学系研究科)

2013/02/09 国立オリンピック記念青少年総合センター

Page 2: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

1

問題

バブルソートにおける数の交換回数の最小値は?

(②で出来るだけ良い選び方をしたい)

3 1 7 9 5

3 1 5 9 7 数列 𝐴′

数列 𝐴 ① 数列 𝐴 が与えられる

② 数を 2 つ選んで交換する

1 3 5 7 9 ③ バブルソートする

Page 3: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

話すこと

1. バブルソートの交換回数とは?

2. 交換回数はどのように変化するか?

3. 満点解法

与えられる 𝐴 に重複がないとして解説します.

重複ありの場合(最後 20 点分)も本質的には同じ.

2

(+10 点解法)

(+30 点解法)

Page 4: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

バブルソートの交換回数とは?

3

Page 5: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

バブルソートの交換回数

大小と左右の関係が逆になっているペアの個数

(ちなみに,反転数という名前がついている)

4

数列 𝐴 をバブルソートした時の交換回数

𝑖 < 𝑗 ,𝑎𝑖 > 𝑎𝑗 となるような組 𝑖, 𝑗 の個数

数列 𝐴 を 𝑎1, 𝑎2, … , 𝑎𝑛 として,

Page 6: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

バブルソートの交換回数

5

𝑖 < 𝑗 ,𝑎𝑖 > 𝑎𝑗 となるような組 𝑖, 𝑗 の個数

3 1 7 9 5 例

3 1 7 9 5

3 1 7 9 5

3 1 7 9 5

3 つ

Page 7: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

バブルソートの交換回数

何故? (略証)

• バブルソートの 1 回の交換で,反転数は 1 減少

• 完了時すなわちソート済みの配列の反転数は 0

6

数列 𝐴 をバブルソートした時の交換回数

𝑖 < 𝑗 ,𝑎𝑖 > 𝑎𝑗 となるような組 𝑖, 𝑗 の個数

Page 8: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

𝑂 𝑛3 解法(10 点)

• 交換する 2 つの数を全通り試す

• 交換回数がどうなるか毎回 𝑂(𝑛) で調べる

(その 2 数に関係する部分だけ数えなおす)

7

Page 9: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

8

Page 10: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

数列を平面にプロットして考えてみよう

9

0

5

10

0 5 10

4 7 3 6 10 5 2 9 1 8

Page 11: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

赤と緑を交換した時,

バブルソートの交換回数はいくつ減る?

10

0

5

10

0 5 10

Page 12: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

現在,緑が反転数に寄与している範囲

11

0

5

10

0 5 10

Page 13: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

現在,赤と緑が反転数に寄与している範囲

12

0

5

10

0 5 10

Page 14: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

交換後

13

0

5

10

0 5 10

Page 15: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

14

0

5

10

0 5 10

0

5

10

0 5 10

交換前 交換後

真ん中の長方形がすっぽり消える!

それ以外の部分は変わらない!

Page 16: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

15

0

5

10

0 5 10

0

5

10

0 5 10

交換前 交換後

交換回数の減少:

(長方形に含まれる点の数)×2 + 1 • ×2:交換前は二重になってるので

• +1:赤と緑それら自体の分

Page 17: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

交換回数はどのように変化するか?

16

つまり,

それを左上・右下にして長方形を描いたら

できるだけ多く点を含むような 2 点を探す

という問題を考えれば良いことになった!

Page 18: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

𝑂 𝑛2 解法(30 点)

• 交換する 2 つの数を全通り試す

• 交換回数がどうなるか毎回 𝑂(1) で調べる

(累積和を前処理として計算しておけばよい)

17

Page 19: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

満点解法

18

Page 20: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

考察

緑を長方形の左上とすることはあり得ない

(緑にするなら赤にしたほうが必ず得)

19

0

2

4

6

8

10

0 2 4 6 8 10

Page 21: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

考察

左上の候補は,自分より左上に点がない点

(上に赤色で示した 3 つだけ)

20

0

2

4

6

8

10

0 2 4 6 8 10

Page 22: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

考察

同様に,右下の候補も絞れる(青い点)

点が 3 種類に分類された!

21

0

2

4

6

8

10

0 2 4 6 8 10

Page 23: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

満点を取りたい……!

𝒏 = 𝟏𝟎𝟓 を解くには 𝑶 𝒏𝟐 は無理

• つまり,交換を全通り試せない……

• うまく一度に大量の可能性を処理しなければならないはず……

どうする?

• 右下候補はさすがに全通り試すとする

• それぞれに対して,最良の左上候補を瞬時に知ることが出来れば良い……出来るか!?

22

Page 24: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

解法を考える

• 青の点を右下にするとしたときの図

• 赤の 3 点は,スコア 2, 2, 1 (スコア=それを左上にした時に囲える点の個数)

23

2

2 1

0

2

4

6

8

10

0 2 4 6 8 10

Page 25: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

解法を考える

• 緑の点を右下にするとしたときの図

• 赤の 3 点は,スコア 0, 2, 3

24

0

2 3

0

2

4

6

8

10

0 2 4 6 8 10

Page 26: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

解法を考える

左から右をスムーズに作れないか?

欲しいものはスコアのみ

25

0

2 3

0

2

4

6

8

10

0 5 10

2

2 1

0

2

4

6

8

10

0 2 4 6 8 10

Page 27: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

0

2

4

6

8

10

0 2 4 6 8 10

考察

考察①

赤い点の列に対して,

灰色の点が影響する部分は連続区間 (連続するある部分に +1 している)

26

+1

+1

Page 28: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

考察

考察②

灰色の点が影響する部分は

右下が違っても変化しない

27

0

0

2

4

6

8

10

0 5 10

0

2

4

6

8

10

0 2 4 6 8 10

+1 +1

Page 29: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

解法を考える

考察③

関係する灰色の点の変化は,

「右の点が入ってくる」

「下の点が出ていく」のみ 28

0

2

4

6

8

10

0 5 10

0

2

4

6

8

10

0 2 4 6 8 10

出ていった

入ってきた

Page 30: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

アルゴリズム

アルゴリズムが作れそうになってきた!

• 左上候補(赤の点)に関するスコアを管理

• 右下候補(青の点)を左から順に試す

– スコアの最大値を見る

• 他の点(灰色の点)は

– 青の点の x 座標が自分より大きくなったら「入る」

(赤の点のある区間に +1)

– 青の点の y 座標が自分より大きくなったら「出る」

(赤の点のある区間に -1)

29

Page 31: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

アルゴリズム

アルゴリズムが作れそうになってきた!

• 左上候補(赤の点)に関するスコアを管理

• 右下候補(青の点)を左から順に試す

– スコアの最大値を見る

• 他の点(灰色の点)は

– 青の点の x 座標が自分より大きくなったら「入る」

(赤の点のある区間に +1)

– 青の点の y 座標が自分より大きくなったら「出る」

(赤の点のある区間に -1)

30

Page 32: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

スコアの管理

列において,以下を効率的に行いたい

• 区間に加算

• 最大値の取得

セグメント木を使ってスコアを管理すれば,両方 𝑂 log 𝑛 で実現可能

各点は,1 回入って,1 回出る.

よって,全体では 𝑶 𝒏 𝐥𝐨𝐠 𝒏 !

セグメント木については,以下などを見て下さい.

「プログラミングコンテストでのデータ構造」

(http://www.slideshare.net/iwiwi/ss-3578491)

31

↑載ってます

Page 33: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

ところで

• 交換回数をどれぐらい減らせるかは分かった

• ところで,最初の列 𝐴 のバブルソートの交換回数はどうやって求めるのか?

– 𝑂 𝑛2 かけて実際にやるのは無理……

2 つの 𝑶 𝒏 𝐥𝐨𝐠 𝒏 の方法

• Binary Indexed Tree を使って数える

• 分割統治法により数える

32

両方載ってます↑

Page 34: 第 12 回 日本情報オリンピック本選 5 バブルソート1 問題 バブルソートにおける数の交換回数の最小値は? (②で出来るだけ良い選び方をしたい)

点数分布

0

10

20

30

40

50

60

70

0 10 20 30 40 50 60 70 80 90 100

33