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

第六回 (2014年10月 24日)

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

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

Martin J. Dürst

AGU

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

目次

これからの予定

前回の残り

前回のまとめ

前回からの宿題

前回からの宿題: heapify_all の計算量

 

整列の重要性

単純な整列方法

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月10日 (月曜日) 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. 一人で資料6000枚をソート
  2. 24人で資料60000枚をソート

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

 

次回のための準備