データ構造とアルゴリズム

第六回 (2013年11月 8日)

分割統治法、マージソート

http://www.sw.it.aoyama.ac.jp/2013/DA/lecture6.html

Martin J. Dürst

AGU

© 2009-13 Martin J. Dürst 青山学院大学

目次

前回のまとめ

前回からの宿題

整列の重要性

単純な整列方法

Ruby の様々な繰返し

一定回数の繰返し

構文:

回数.times do
  # 何かの作業
end

応用例:

(length-1).times do
  # bubble
end

指数を使った繰返し

構文:

出発値.upto 目的値 do |指数変数|
  # 指数変数を使った作業
end

応用例:

0.upto(length-2) do |i|
  # select
end

バブル整列法

(bubble sort)

改良:

実装の例: 6sort.rb (下記の整列法も同様)

 

選択整列法

(selection sort)

選択整列の計算量の詳細

挿入整列法

(insertion sort)

改良: 番兵 (sentinel) の使用: 最初の項目の前に全ての項目より小さいものを設置

分割統治法

(divide and conquer, ラテン語: divide et impera)

マージソート (再帰無し)

(merge sort)

併合

(merge)

マージソート

(merge sort)

マージソートの計算量

 

整列の計算量

マージソートの特長

まとめ

レポート: 手作業によるソート

提出: 再来週の木曜日 (11月2021日) 19時00分締切; O 棟 529号室の前の箱に提出; 手書き A4 紙二枚まで (表裏で合計4ページまで) 厳守

(資料を参考にしなくて解けた方がいいですが、ウェブページも含め必ず使った資料全ての詳細を列挙すること。Wikipedia 等への参照の場合、URI のではなく IRI を使用のこと (例: http://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1 のではなく http://ja.wikipedia.org/wiki/情報))。

採点はアルゴリズムの速さにかかわらず満点、特に早いアルゴリズムを考えた場合に追加点。

名前、ふりがな、学生番号だけではなく、授業名と課題名も明記のこと。

手作業の場合に効率的な順列アルゴリズムを考えて提案して分析しなさい。

条件は次の通り: 資料がそれぞれ A4 の紙一枚。見やすい位置に10桁の番号が書かれている。その番号の昇順にソートする。番号の分布については一切不明。二つのケースを想定:

  1. 一人で資料5000枚をソート
  2. 20人で資料50000枚をソート

共通のアルゴリズムでも別々のアルゴリズムでもよい。分析では O() での計算量 (理由つき) と実際に想定される時間。今まで習ったアルゴリズムとの類似点や相違点、手作業の特徴に考量した点などについても論じる。

 

次回のための準備