SlideShare une entreprise Scribd logo
1  sur  21
アルゴリズムとデータ構
造
11.「整列アルゴリズ
ム II 」2011 年 4 月 27 日(水)
服部 健太
2011/4/27 アルゴリズムとデータ構造 11 2
概要
 より効率的な整列手法である,クイックソー
ト,ヒープソート,マージソートについて説
明する
 それらの計算量についても議論する
 優先順位キューについて説明し,ヒープによ
る実現方法を示す
 基数ソートの概要を説明する
2011/4/27 アルゴリズムとデータ構造 11 3
クイックソート
 平均, O(n log n) の高速なアルゴリズム
 ただし,最悪の場合, O(n2
) かかる
 1960 年に C.A.R. ホーアが発明
 Elliot803 という計算機向けに,シェルソートのラ
イブラリルーチンを実装しているときに思いつい
たらしい
 分割統治( Divide and Conquer )という考
え方にもとづく
2011/4/27 アルゴリズムとデータ構造 11 4
クイックソートの原理
 整列するデータの中から適当な基準値(ピボット:
pivot )を一つ選ぶ
 配列の要素を一つずつ調べて,基準値より小さい値
を左側に,大きい値を右側に集める.
 小さい部分と大きい部分に対して,クイックソート
を再帰的に適用する
小 大
基準値left right
2011/4/27 アルゴリズムとデータ構造 11 5
クイックソートの素朴な実現
def quick_sort(A, left, right):
if left < right:
p = partition(A, left, right)
quick_sort(A, left, p – 1)
quick_sort(A, p + 1, right)
def partition(A, left, right):
pivot = A[right]
p = left - 1
for i in range(left, right):
if A[i] <= pivot:
p = p + 1; swap(A, p, i)
swap(A, p + 1, right)
return p + 1
2 8 7 1 3 5 6 4
left right
↑i↑p
2 8 7 1 3 5 6 4
↑i↑p
2 8 7 1 3 5 6 4
↑i↑p
2 8 7 1 3 5 6 4
↑i↑p
2 1 7 8 3 5 6 4
↑i↑p
2 1 3 8 7 5 6 4
↑i↑p
2 1 3 8 7 5 6 4
↑i↑p
2 1 3 87 5 64
↑i↑p
2011/4/27 アルゴリズムとデータ構造 11 6
クイックソートの計算量
 最悪の計算量
 ピボットとして常に,最大,または,最小のものが選択さ
れる
 一方が n-1 ,もう一方が空の組に分割される
 O(N2
)
 最良の計算量
 ピボットとして常に中央の値が選択される
 半分ずつに分割される
 O(NlogN)
 平均的な計算量
 O(NlogN)
2011/4/27 アルゴリズムとデータ構造 11 7
ヒープソート
 以下の形のコードで表せる
 for i in range(n-1, 0, -1):
 A[1], …, A[i] のうち最大値を求めそれを A[p] と
する
 A[i] と A[p] を入れ換える
 選択法の改良
 単純な選択法では,線形探索によって最大値(最
小値)を求めた
 最大値をすばやく求めることができれば,たとえ
ば, logN の計算量で最大値を取り出せれば,全
体の計算量は NlogN となる
2011/4/27 アルゴリズムとデータ構造 11 8
部分順序付き木( partially ordered
tree )
 最大値(最小値)を求めるのに適したデータ構造
 以下の制約を満たす木(2分木)
 子は親より常に小さいか等しい(大きいか等しい)
 子要素間の大小関係に制約は無い
25
15 23
13 8 9
5 12 1
根は常に最
大値となる
19
20
a b
c d
b
a c
d
b>a, c>d の場合の
木の組み替え
2011/4/27 アルゴリズムとデータ構造 11 9
ヒープ( heap )
 部分順序付き木を配列上に表現したもの
 ノード同士の親子関係をポインタを用いず表す
 ヒープ領域といったときの(メモリ領域を表す)
ヒープとは異なる用語なので注意
25
15 23
13 9
5 12
20
25 15 23 13 8 9 20
1
8
5 12 1
0 9
0
1 2
3 4 5 6
7 8 9
def parent(i):
return (i-1) // 2
def left_child(i):
return 2 * i + 1
def right_child(i):
return 2 * (i + 1)
2011/4/27 アルゴリズムとデータ構造 11 10
ヒープからの最大値の取り出し
25
15 23
13 9
5 12
20
1
8
15 1
13 9
5 12
208
23
15 23
13 9
5 12
208
1
15 20
13 9
5 12
18
23
(1)配列の最後の要素を先頭に持ってくる
     A[0] = A[heap_size-1]
     heap_size =heap_size - 1
(2)ヒープを正しく組み替える
  大きい方の子と交換
2011/4/27 アルゴリズムとデータ構造 11 11
ヒープの組み替え
 入力:配列 A ,インデックス i
 left_child(i) と right_child(i) はそれぞれヒープ
 A[i] は,子より小さいかもしれない
 ヒープ条件が満たされていないかもしれない
def max_heapify_down(A, i, heap_size):
l = left_child(i)
r = right_child(i)
if l < heap_size and A[l] > A[i]:
largest = l
else:
largest = i
if r < heap_size and A[r] > A[largest]:
largest = r
if largest != i:
swap(A, i, largest)
max_heapify_down(A, largest, heap_size)
heap_size はヒープ
の要素数を保持する
ものとする
2011/4/27 アルゴリズムとデータ構造 11 12
ヒープの初期化
 max_heapify_down をボトムアップに
適用していくことで,ヒープを初期化する
def build_max_heap(A):
for i in range(parent(len(A)), 0, -1):
max_heapify_down(A, i-1, len(A))
1 3
2 9
14 8
10
4
16
7
4 1 3 2 7 9 1014 8 16A:
0
1 2
3 4 5 6
7 8 9
90
max_heapify_down(A,5)
14 10
8 9
2 4
3
16
1
7
0
1 2
3 4 5 6
7 8 9
1 3
2 9
14 8
10
4
7
16
0
1 2
3 4 5 6
7 8 9
max_heapify_down(A,4)
2011/4/27 アルゴリズムとデータ構造 11 13
ヒープソートの実現
 以下の処理を繰返し,大きい方の値から順次
確定していく
 ヒープから最大値を取り出して,ヒープ
の大きさを1減らし,ヒープを再構成す
る
 ヒープの大きさを減らすとき, A[i] の場所
があくので,取り出した最大値をそこに
置くのがポイント
def heap_sort(A):
heap_size = len(A)
build_max_heap(A)
for i in range(len(A)-1, 0, -1):
swap(A, i, 0)
heap_size = heap_size – 1
max_heapfy_down(A, 0, heap_size)
14 10
8 9
2 4
3
16
1
7
0
1 2
3 4 5 6
7 8 9
14
108
9
2
4 3
161
7
0
1 2
3 4 5 6
7 8
swap(A,1,10)
heap_size を 1 減らす
max_heapify_down(A,10)
2011/4/27 アルゴリズムとデータ構造 11 14
ヒープソートの計算量
 ヒープの作成: O(N)
 max_heapify_down(A,i) で調べる段数
 最大値を取り出す部分: O(N log N)
 したがって, O(N log N)
 平均的には,クイックソートの 2 倍くらい遅い
     
   
)1(21)1(2)2(2221
2
1)1(log8/24/12/0
24/18/
12/14/012/
32
+−=×−+×−++×+×
=
×−++×+×+×
+
++
−−
kkk
N
NNNN
NN
NNNNi
kkk
k



とすると,となる.
全体では,
段,では~
段,では~段,では~が
2011/4/27 アルゴリズムとデータ構造 11 15
優先順位キュー( priority queue )
 以下の 3 つの操作を提供する抽象データ型
 INSERT(PQ, x)
 優先順位キュー PQ に要素 x を挿入する
 REMOVE(PQ)
 優先順位キュー PQ から最大(最小)の値を持つ要素を取り
除き,それを返す
 PEEK(PQ)
 優先順位キュー PQ の最大(最小)の値を取得する
 応用例:
 ジョブのスケジューリング:
優先度の高いジョブから取り出して実行する
 イベント駆動のシミュレーション:
直近のイベントから順に取り出してシミュレートする
2011/4/27 アルゴリズムとデータ構造 11 16
ヒープによる優先順位キューの実
現
def max_heap_insert(PQ, x):
PQ.elems[PQ.heap_size] = x
PQ.heap_size = PQ.heap_size + 1
max_heapify_up(PQ.elems, PQ.heap_size - 1)
def max_heapify_up(A, i):
while i > 0:
j = parent(i)
if A[j] >= A[i]: break
swap(A, i, j)
i = j
 練習問題:
 max_heap_insert(PQ), max_heap_remove(PQ) のコードを書け
2011/4/27 アルゴリズムとデータ構造 11 17
解答例
def max_heap_peek(PQ):
return PQ.elems[0]
def max_heap_remove(PQ):
if PQ.heap_size < 1: error(“empty queue”)
max = PQ.elems[0]
PQ.elems[0] = PQ.elems[PQ.heap_size-1]
PQ.heap_size = PQ.heap_size – 1
max_heapify_down(PQ.elems, 0, PQ.heap_size)
return max
2011/4/27 アルゴリズムとデータ構造 11 18
マージソート
 マージを基本操作とする整列アルゴリズム
 マージ( merging ):
整列された2つの列を合わせて1つの整列された列を作る
操作
 計算量は O(N log N)
 連結リストの整列に向いた手法
 リストの場合,要素を順番にしか参照できないため,ク
イックソートやヒープソートでは効率が悪くなる
2 115 17
4 1513
2 54 11 13 1715
・・・
・・・
・・・
2011/4/27 アルゴリズムとデータ構造 11 19
リストのマージ
def merge(n, m):
dummy = node()
tail = dummy
while n != None and m != None:
if n.elem <= m.elem:
tail.next = n; tail = n
n = n.next
else:
tail.next = m; tail = m
m = m.next
if n != None: tail.next = n
else: tail.next = m
return dummy.next
3 6 7
n
1 5 8 12
m
tail, dummy
dummy
1
tail
5 8 12
m
dummy
1
tail
3 6 7
n
5 8 12
m
3 6 7
n
2011/4/27 アルゴリズムとデータ構造 11 20
マージソート(リスト版)の実現
 リストを 2 つに分割し,それぞれのリストに対して,再帰的にマー
ジソートを行い,それらを再びマージする.
def merge_sort(n):
if n != None and n.next != None:
p = n; q = n.next
while q != None and q.next != None:
p = p.next; q = q.next.next
m = p.next
p.next = None
return merge(merge_sort(n), merge_sort(m))
else:
return n
リストの中央を見つける巧妙
なテクニック.
p がリストの末尾に到達した
時点で, q は半分ほど進んで
いる
2011/4/27 アルゴリズムとデータ構造 11 21
基数ソート( radix sort )
 キーが k 桁の数や k 文字の文字列など,有限
の範囲の場合に使える
 下位の桁から計数ソートを繰り返し用いる
3 1 9
1 8 2
0 4 2
8 4 0
2 2 3
6 7 1
8 53
5 13
3 1 9
1 8 2
0 4 2
8 4 0
2 2 3
6 7 1
8 53
5 13
3 1 9
1 8 2
0 4 2
8 4 0
2 2 3
6 7 1
8 53
5 13
3 1 9
1 8 2
0 4 2
8 4 0
2 2 3
6 7 1
8 53
5 13

Contenu connexe

Tendances

[アルゴリズムイントロダクション勉強会] ハッシュ
[アルゴリズムイントロダクション勉強会] ハッシュ[アルゴリズムイントロダクション勉強会] ハッシュ
[アルゴリズムイントロダクション勉強会] ハッシュRei Takami
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
 
圏論とHaskellは仲良し
圏論とHaskellは仲良し圏論とHaskellは仲良し
圏論とHaskellは仲良しohmori
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scioJulien Tournay
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Takeo Noda
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Takashi J OZAKI
 
pre: 数列で学ぶ初めての CommonLisp #fibonacci
pre: 数列で学ぶ初めての CommonLisp #fibonaccipre: 数列で学ぶ初めての CommonLisp #fibonacci
pre: 数列で学ぶ初めての CommonLisp #fibonaccipgf2alpha
 
アルゴリズムとデータ構造4
アルゴリズムとデータ構造4アルゴリズムとデータ構造4
アルゴリズムとデータ構造4Kenta Hattori
 
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Masaru Watanabe
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)Yoichi Nakayama
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Shintaro Fukushima
 
ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)yutannihilation
 

Tendances (20)

[アルゴリズムイントロダクション勉強会] ハッシュ
[アルゴリズムイントロダクション勉強会] ハッシュ[アルゴリズムイントロダクション勉強会] ハッシュ
[アルゴリズムイントロダクション勉強会] ハッシュ
 
圏とHaskellの型
圏とHaskellの型圏とHaskellの型
圏とHaskellの型
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 
圏論とHaskellは仲良し
圏論とHaskellは仲良し圏論とHaskellは仲良し
圏論とHaskellは仲良し
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scio
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 
kollectionの紹介
kollectionの紹介kollectionの紹介
kollectionの紹介
 
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
 
pre: 数列で学ぶ初めての CommonLisp #fibonacci
pre: 数列で学ぶ初めての CommonLisp #fibonaccipre: 数列で学ぶ初めての CommonLisp #fibonacci
pre: 数列で学ぶ初めての CommonLisp #fibonacci
 
アルゴリズムとデータ構造4
アルゴリズムとデータ構造4アルゴリズムとデータ構造4
アルゴリズムとデータ構造4
 
Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方Sclalaz Kleisli の使い方
Sclalaz Kleisli の使い方
 
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
すごいHaskell読書会 in 大阪 2週目 #5 第5章:高階関数 (2)
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
ggplot2 110129
ggplot2 110129ggplot2 110129
ggplot2 110129
 
HashMapとは?
HashMapとは?HashMapとは?
HashMapとは?
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)
 
ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)
 

Plus de Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta Hattori
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6Kenta Hattori
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4Kenta Hattori
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 

Plus de Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 

Dernier

東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラムKochi Eng Camp
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~Kochi Eng Camp
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料Tokyo Institute of Technology
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 

Dernier (8)

東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 

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

  • 2. 2011/4/27 アルゴリズムとデータ構造 11 2 概要  より効率的な整列手法である,クイックソー ト,ヒープソート,マージソートについて説 明する  それらの計算量についても議論する  優先順位キューについて説明し,ヒープによ る実現方法を示す  基数ソートの概要を説明する
  • 3. 2011/4/27 アルゴリズムとデータ構造 11 3 クイックソート  平均, O(n log n) の高速なアルゴリズム  ただし,最悪の場合, O(n2 ) かかる  1960 年に C.A.R. ホーアが発明  Elliot803 という計算機向けに,シェルソートのラ イブラリルーチンを実装しているときに思いつい たらしい  分割統治( Divide and Conquer )という考 え方にもとづく
  • 4. 2011/4/27 アルゴリズムとデータ構造 11 4 クイックソートの原理  整列するデータの中から適当な基準値(ピボット: pivot )を一つ選ぶ  配列の要素を一つずつ調べて,基準値より小さい値 を左側に,大きい値を右側に集める.  小さい部分と大きい部分に対して,クイックソート を再帰的に適用する 小 大 基準値left right
  • 5. 2011/4/27 アルゴリズムとデータ構造 11 5 クイックソートの素朴な実現 def quick_sort(A, left, right): if left < right: p = partition(A, left, right) quick_sort(A, left, p – 1) quick_sort(A, p + 1, right) def partition(A, left, right): pivot = A[right] p = left - 1 for i in range(left, right): if A[i] <= pivot: p = p + 1; swap(A, p, i) swap(A, p + 1, right) return p + 1 2 8 7 1 3 5 6 4 left right ↑i↑p 2 8 7 1 3 5 6 4 ↑i↑p 2 8 7 1 3 5 6 4 ↑i↑p 2 8 7 1 3 5 6 4 ↑i↑p 2 1 7 8 3 5 6 4 ↑i↑p 2 1 3 8 7 5 6 4 ↑i↑p 2 1 3 8 7 5 6 4 ↑i↑p 2 1 3 87 5 64 ↑i↑p
  • 6. 2011/4/27 アルゴリズムとデータ構造 11 6 クイックソートの計算量  最悪の計算量  ピボットとして常に,最大,または,最小のものが選択さ れる  一方が n-1 ,もう一方が空の組に分割される  O(N2 )  最良の計算量  ピボットとして常に中央の値が選択される  半分ずつに分割される  O(NlogN)  平均的な計算量  O(NlogN)
  • 7. 2011/4/27 アルゴリズムとデータ構造 11 7 ヒープソート  以下の形のコードで表せる  for i in range(n-1, 0, -1):  A[1], …, A[i] のうち最大値を求めそれを A[p] と する  A[i] と A[p] を入れ換える  選択法の改良  単純な選択法では,線形探索によって最大値(最 小値)を求めた  最大値をすばやく求めることができれば,たとえ ば, logN の計算量で最大値を取り出せれば,全 体の計算量は NlogN となる
  • 8. 2011/4/27 アルゴリズムとデータ構造 11 8 部分順序付き木( partially ordered tree )  最大値(最小値)を求めるのに適したデータ構造  以下の制約を満たす木(2分木)  子は親より常に小さいか等しい(大きいか等しい)  子要素間の大小関係に制約は無い 25 15 23 13 8 9 5 12 1 根は常に最 大値となる 19 20 a b c d b a c d b>a, c>d の場合の 木の組み替え
  • 9. 2011/4/27 アルゴリズムとデータ構造 11 9 ヒープ( heap )  部分順序付き木を配列上に表現したもの  ノード同士の親子関係をポインタを用いず表す  ヒープ領域といったときの(メモリ領域を表す) ヒープとは異なる用語なので注意 25 15 23 13 9 5 12 20 25 15 23 13 8 9 20 1 8 5 12 1 0 9 0 1 2 3 4 5 6 7 8 9 def parent(i): return (i-1) // 2 def left_child(i): return 2 * i + 1 def right_child(i): return 2 * (i + 1)
  • 10. 2011/4/27 アルゴリズムとデータ構造 11 10 ヒープからの最大値の取り出し 25 15 23 13 9 5 12 20 1 8 15 1 13 9 5 12 208 23 15 23 13 9 5 12 208 1 15 20 13 9 5 12 18 23 (1)配列の最後の要素を先頭に持ってくる      A[0] = A[heap_size-1]      heap_size =heap_size - 1 (2)ヒープを正しく組み替える   大きい方の子と交換
  • 11. 2011/4/27 アルゴリズムとデータ構造 11 11 ヒープの組み替え  入力:配列 A ,インデックス i  left_child(i) と right_child(i) はそれぞれヒープ  A[i] は,子より小さいかもしれない  ヒープ条件が満たされていないかもしれない def max_heapify_down(A, i, heap_size): l = left_child(i) r = right_child(i) if l < heap_size and A[l] > A[i]: largest = l else: largest = i if r < heap_size and A[r] > A[largest]: largest = r if largest != i: swap(A, i, largest) max_heapify_down(A, largest, heap_size) heap_size はヒープ の要素数を保持する ものとする
  • 12. 2011/4/27 アルゴリズムとデータ構造 11 12 ヒープの初期化  max_heapify_down をボトムアップに 適用していくことで,ヒープを初期化する def build_max_heap(A): for i in range(parent(len(A)), 0, -1): max_heapify_down(A, i-1, len(A)) 1 3 2 9 14 8 10 4 16 7 4 1 3 2 7 9 1014 8 16A: 0 1 2 3 4 5 6 7 8 9 90 max_heapify_down(A,5) 14 10 8 9 2 4 3 16 1 7 0 1 2 3 4 5 6 7 8 9 1 3 2 9 14 8 10 4 7 16 0 1 2 3 4 5 6 7 8 9 max_heapify_down(A,4)
  • 13. 2011/4/27 アルゴリズムとデータ構造 11 13 ヒープソートの実現  以下の処理を繰返し,大きい方の値から順次 確定していく  ヒープから最大値を取り出して,ヒープ の大きさを1減らし,ヒープを再構成す る  ヒープの大きさを減らすとき, A[i] の場所 があくので,取り出した最大値をそこに 置くのがポイント def heap_sort(A): heap_size = len(A) build_max_heap(A) for i in range(len(A)-1, 0, -1): swap(A, i, 0) heap_size = heap_size – 1 max_heapfy_down(A, 0, heap_size) 14 10 8 9 2 4 3 16 1 7 0 1 2 3 4 5 6 7 8 9 14 108 9 2 4 3 161 7 0 1 2 3 4 5 6 7 8 swap(A,1,10) heap_size を 1 減らす max_heapify_down(A,10)
  • 14. 2011/4/27 アルゴリズムとデータ構造 11 14 ヒープソートの計算量  ヒープの作成: O(N)  max_heapify_down(A,i) で調べる段数  最大値を取り出す部分: O(N log N)  したがって, O(N log N)  平均的には,クイックソートの 2 倍くらい遅い           )1(21)1(2)2(2221 2 1)1(log8/24/12/0 24/18/ 12/14/012/ 32 +−=×−+×−++×+× = ×−++×+×+× + ++ −− kkk N NNNN NN NNNNi kkk k    とすると,となる. 全体では, 段,では~ 段,では~段,では~が
  • 15. 2011/4/27 アルゴリズムとデータ構造 11 15 優先順位キュー( priority queue )  以下の 3 つの操作を提供する抽象データ型  INSERT(PQ, x)  優先順位キュー PQ に要素 x を挿入する  REMOVE(PQ)  優先順位キュー PQ から最大(最小)の値を持つ要素を取り 除き,それを返す  PEEK(PQ)  優先順位キュー PQ の最大(最小)の値を取得する  応用例:  ジョブのスケジューリング: 優先度の高いジョブから取り出して実行する  イベント駆動のシミュレーション: 直近のイベントから順に取り出してシミュレートする
  • 16. 2011/4/27 アルゴリズムとデータ構造 11 16 ヒープによる優先順位キューの実 現 def max_heap_insert(PQ, x): PQ.elems[PQ.heap_size] = x PQ.heap_size = PQ.heap_size + 1 max_heapify_up(PQ.elems, PQ.heap_size - 1) def max_heapify_up(A, i): while i > 0: j = parent(i) if A[j] >= A[i]: break swap(A, i, j) i = j  練習問題:  max_heap_insert(PQ), max_heap_remove(PQ) のコードを書け
  • 17. 2011/4/27 アルゴリズムとデータ構造 11 17 解答例 def max_heap_peek(PQ): return PQ.elems[0] def max_heap_remove(PQ): if PQ.heap_size < 1: error(“empty queue”) max = PQ.elems[0] PQ.elems[0] = PQ.elems[PQ.heap_size-1] PQ.heap_size = PQ.heap_size – 1 max_heapify_down(PQ.elems, 0, PQ.heap_size) return max
  • 18. 2011/4/27 アルゴリズムとデータ構造 11 18 マージソート  マージを基本操作とする整列アルゴリズム  マージ( merging ): 整列された2つの列を合わせて1つの整列された列を作る 操作  計算量は O(N log N)  連結リストの整列に向いた手法  リストの場合,要素を順番にしか参照できないため,ク イックソートやヒープソートでは効率が悪くなる 2 115 17 4 1513 2 54 11 13 1715 ・・・ ・・・ ・・・
  • 19. 2011/4/27 アルゴリズムとデータ構造 11 19 リストのマージ def merge(n, m): dummy = node() tail = dummy while n != None and m != None: if n.elem <= m.elem: tail.next = n; tail = n n = n.next else: tail.next = m; tail = m m = m.next if n != None: tail.next = n else: tail.next = m return dummy.next 3 6 7 n 1 5 8 12 m tail, dummy dummy 1 tail 5 8 12 m dummy 1 tail 3 6 7 n 5 8 12 m 3 6 7 n
  • 20. 2011/4/27 アルゴリズムとデータ構造 11 20 マージソート(リスト版)の実現  リストを 2 つに分割し,それぞれのリストに対して,再帰的にマー ジソートを行い,それらを再びマージする. def merge_sort(n): if n != None and n.next != None: p = n; q = n.next while q != None and q.next != None: p = p.next; q = q.next.next m = p.next p.next = None return merge(merge_sort(n), merge_sort(m)) else: return n リストの中央を見つける巧妙 なテクニック. p がリストの末尾に到達した 時点で, q は半分ほど進んで いる
  • 21. 2011/4/27 アルゴリズムとデータ構造 11 21 基数ソート( radix sort )  キーが k 桁の数や k 文字の文字列など,有限 の範囲の場合に使える  下位の桁から計数ソートを繰り返し用いる 3 1 9 1 8 2 0 4 2 8 4 0 2 2 3 6 7 1 8 53 5 13 3 1 9 1 8 2 0 4 2 8 4 0 2 2 3 6 7 1 8 53 5 13 3 1 9 1 8 2 0 4 2 8 4 0 2 2 3 6 7 1 8 53 5 13 3 1 9 1 8 2 0 4 2 8 4 0 2 2 3 6 7 1 8 53 5 13