高速ソートと 安定結婚問題 平成24年12月14日.

Slides:



Advertisements
Similar presentations
4.3 マージソート.
Advertisements

極小集合被覆を列挙する 実用的高速アルゴリズム
離散システム特論 整列(sorting)アルゴリズム 2.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
アルゴリズムイントロダクション第2章 主にソートに関して
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
第12回 ソート(3): シェルソート、クイックソート
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
2009/10/30 整列アルゴリズム (2) 第5講: 平成21年10月30日 (金) 4限 E252教室 コンピュータアルゴリズム.
データ構造とアルゴリズム論 第6章 探索のアルゴリズム
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
4.整列のアルゴリズム.
アルゴリズムとデータ構造 --- 理論編 --- 山本 真基
第10回 ソート(1):単純なソートアルゴリズム
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
第11回 整列 ~ シェルソート,クイックソート ~
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
算法数理工学 第1回 定兼 邦彦.
二分探索木によるサーチ.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
数学 ---> 抽象化、一般化 より複雑な関係ー>解析学 一次関数 y=ax+b より多くの要素ー>線形代数 x y f(x) y1 x1
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
2009/11/6 整列アルゴリズムの復習 第6講: 平成21年11月6日 (金) 4限 E252教室 コンピュータアルゴリズム.
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
ソートアルゴリズムの種類 選択ソート (selection sort) バブルソート (bubble sort)
情報工学概論 (アルゴリズムとデータ構造)
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
データ構造とアルゴリズム論 第6章 整列(ソート)のアルゴリズム
安定結婚問題に対する 近似アルゴリズム 岩間一雄 宮崎修一 山内直哉 (京都大学) 科学研究費特定領域研究
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
クイックソート.
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとプログラミング (Algorithms and Programming)
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
アルゴリズムとデータ構造1 2005年6月24日
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 探索と計算量.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
プログラミング演習Ⅲ- Sorting Quick Sort and Merge Sort
ナップサック問題 クマさん人形をめぐる熱いドラマの結末.
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとプログラミング (Algorithms and Programming)
バブルソート,バケツソート,クイックソート
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2013年7月2日
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
アルゴリズムとデータ構造 2012年6月25日
ヒープソート.
ヒープソート.
参考:大きい要素の処理.
プログラミング入門2 第5回 配列 変数宣言、初期化について
アルゴリズム ~すべてのプログラムの基礎~.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

高速ソートと 安定結婚問題 平成24年12月14日

高速ソート

単純なソートアルゴリズム バブルソート O(n2) 選択ソート O(n2) 挿入ソート O(n2) もっと高速なソートアルゴリズムは?   バブルソート  O(n2)     選択ソート    O(n2)     挿入ソート    O(n2)   もっと高速なソートアルゴリズムは? 計算量が O(n log n) のソートアルゴリズム   クイックソート   ヒープソート   マージソート この中でクィックソートが最速 (ランダムデータに対して.不得手な場合もある)

クイックソートの原理 考え方: 分割統治法(divide and conquer) まず、配列中の適当な要素を選ぶ    → これを枢軸(pivot)と呼ぶ 次のように要素を並べ替える    → これを分割(partition)という a[0]  ・・・・・・・・・・ a[v-1] a[v] a[v+1] ・・・ a[n-1] a[v]より小(以下) a[v] a[v]より大(以上)

では、a[0],・・・,a[v-1]の部分と、 a[v+1],・・・,a[n-1]の部分は どうするか? では、a[0],・・・,a[v-1]の部分と、     a[v+1],・・・,a[n-1]の部分は どうするか?      ↓ ピボットの選択 →分割を再帰的に繰り返せばよい!

クィックソートのアルゴリズム概観 ①ソートするデータ区間のデータを得る ②区間内のデータ数が2以下の時 2-1:データ数が1以下の時なにもしない 2-2:データ数が2の時,必要なら交換 ③区間内のデータ数が3以上の時 3-1:区間内でピボットを選ぶ(便宜的に右端) 3-2:区間内で,ピボットより小さい区間(左半分)と大きい区間(右半分)に分割する 3-3:3-2の両区間を再帰的処理する

/* 配列aのうち a[l]~a[r] を整列する */ quick_sort ( int a[ ], int l, int r ) {   if( 整列する要素が一つのみである )     return;   適当な要素 a[v] を枢軸にして、     a[v] より小さい要素を a[l]~a[v-1] に集め、     a[v] より大きい要素を a[v+1]~a[r] に集める     quick_sort ( a, l, v-1 ); /* 左の部分を整列する */     quick_sort ( a, v+1, r ); /* 右の部分を整列する */ }

分割のアルゴリズム 0a.一番右の要素を枢軸に選ぶ 0b.ポインタ i を左端に、ポインタ j を枢軸の すぐ左に設定する    すぐ左に設定する 1.枢軸より大きな要素が見つかるまで    i を右へスキャン 2.枢軸より小さな要素が見つかるまで    j を左へスキャン 3. i が指す要素と j が指す要素を交換する 4. i と j がぶつかるまで1~3を繰り返す 5. j の指す要素と枢軸と交換する

ピボット i j 55 3 74 20 13 87 46 30 前半に<30,後半に>30を置く.それに反するものを入れ替える j 55 3 74 20 13 87 46 30 i j 13 3 74 20 55 87 46 30 j i 13 3 74 20 55 87 46 30 j i 13 3 20 74 55 87 46 30 左スキャンと右スキャンが交錯したらピボットをそこに置く→@ピボットの左にピボットより小さい値,右に大きい値があるはず j v i 13 3 20 30 55 87 46 74

再帰版クイックソート /* 配列a[l]~a[r]を分割する。枢軸の添え字を返す */ int partition( int a[ ], int l, int r ) { int i, j, pivot, t; i = l – 1; j = r; /* ポインタ i と j を初期化する */ pivot = a[r]; /* いちばん右端の要素を枢軸にする */ for( ; ; ) { /* ポインタ i と j とがぶつかるまで繰り返す */ while( a[++i] < pivot ) ; /* ポインタ i を右へ進める */ while( i < j && pivot < a[j] ) ; /* ポインタ i を左へ進める */ if ( i >= j ) break; /* ポインタ i と j がぶつかったらループを抜ける */ t = a[i]: a[i] = a[j]; a[j] = t; /* i の指す要素と j の指す要素を交換する */ } t = a[i]: a[i] = a[r]; a[r] = t; /* a[i] と枢軸を交換する */ return i; }

クイックソートの計算量 最適な分割: pivot がほぼ中央に来る → ほぼ半分ずつに分割される  pivot がほぼ中央に来る  → ほぼ半分ずつに分割される  → 要素1までの分割数をpとすると 2p =n ,よってp=log 2n回分割が必要    部分列の個数はn個.    → 計算量は O(n log n)

最悪の分割:ピボット が端に来る ↓ 分割のレベル数(深さ)は n 計算量は O(n2) 枢軸より大きい 要素 0個 まとめ: 最悪の分割:ピボット が端に来る      ↓ 分割のレベル数(深さ)は n 計算量は O(n2) 枢軸 枢軸より小さい要素 k-1個 まとめ:  クイックソートの計算量は   最良 O(n log n)  平均も!   最悪 O(n2)

クイックソートの改善方法 部分配列の長さが10程度以下になったら、 挿入ソートに切り替える 最悪の場合を回避する 中央値を枢軸に  挿入ソートに切り替える    k1・n2 >? k2・n log2n  (k1<k2)     俗に quicker sort 最悪の場合を回避する     部分配列の右端、中央、左端の3つのうちの   中央値を枢軸に

再帰の深さを減らす   → 左右の部分配列のうち、      短いほうから先に処理をする        → 再帰の深さは最大 log2n 程度   → 非再帰版       →  再帰の処理をスタックを利用して          自分で行なう。

安定結婚問題

安定結婚問題 フィーリングカップル5対5 (講義1回目) 安定結婚問題 フィーリングカップル5対5 (講義1回目) 1 2 3 4 5 ① ② ③ ④ ⑤

安定結婚問題 ・ 最初の論文 → [Gale & Shapley 1962] - アメリカの研修医配属問題がきっかけ。   - アメリカの研修医配属問題がきっかけ。   - どんな例題にも、必ず安定マッチングが存在する。   - 安定マッチングを多項式時間で見つけることができる。 (Gale-Shapley アルゴリズム) ・様々な類似問題 - 安定ルームメイト問題   - Residents/Hospitals 問題 ・最近、様々な新種の問題 ・実世界での応用   研修医配属   NRMP (National Resident Matching Program)   CaRMS (Canadian Resident Matching Service)   SPA (Scottish Pre-registration house officer Allocations) JRMP (Japanese Resident Matching Program)

不安定結婚とは カップルでない男女双方ともに互いに対する好感度が自分のカップル相手よりも高い場合、そのカップルは持続せず解消してしまう。 →不安定なカップル 上記の状況が全く発生していない →安定なカップル

力任せで安定結婚問題を解くアルゴリズム コンピュータは速いから、すべての5組カップルを生成して (5!=5*4*3*2*1=120)、それが安定か不安定かを調べればいい? N=11         1秒 N=12        4秒 N=13  2分52秒 N=14  42分30秒 N=15 11時間 ・すべての組み合わせを作る計算量は N! ・安定性をチェックする計算量は     N*N ・よって総計算量は             N!*N*N ・N=16のときの大よその実行時間は  1週間

もっと速いアルゴリズムは? なぜ遅い? ⇒すべての組合せを生成して,毎回浮気のチェックをしているので,   入力データ数Nの壁に阻まれる生成検査法(Generate and Test) ⇒一発で解が作れないか? ⇒それは無理 ⇒でも無意味な組み合わせから始めるのはよくない ⇒どのような組合せなら作成可能で無駄が少ないか? ①理想的な状態(浮気が起こらない組合せ)から始めてみてはどうか?   理想状態=第一希望の異性とのカップル   相手にパートナーがいるか否かを無視して、とりあえず強引に第一希望に申し込む。既にパートナーがいれば、その好感度を比較して、既存パートナーの好感度が高ければ、申込を破棄、低ければ、パートナーを解消して、新パートナーを作る。

もっと速いアルゴリズムは? ②乗り換え発生時:カップル解消された人は困りますよね。その人は、一つ好感度が低い人に新たにカップルを申し入れて、先程と同様の処理をする。 ③カップル解消が起きて一人はじかれると、 入れ替え(玉突き現象)が際限なく起こらない? ⇒これは大丈夫。好感度が一つ低い相手を選ぶので、 一度のカップル解消で最大入れ替え回数は?回

手順4? ... ? 下記の例で効率的アルゴリズムを実行してみると × ④③②⑤① ③②⑤①④ ④②⑤③① ④⑤③①② ②③④①⑤ 41325 13524 35124 42135 43215 × 男子 女子 手順1 男性1 ④ 手順2 男性2 ③ 手順3 男性3 ④→2 手順4? ... ?

フィーリングカップル5対5 の解答 ④③②⑤① ③②⑤①④ ④②⑤③① ④⑤③①② ②③④①⑤ 41325 13524 35124 42135 43215 × 男子 女子 手順1 男性1:④ 手順2 男性1:④ 男性2:③ 手順3 男性1:④ 男性2:③ 男性3:④→② 手順4 男性1:④→③ 男性2:③→②→⑤ 男性3:④→② 男性4:④ 手順5 男性1:④→③→② 男性2:③→②→⑤→① 男性3:④→②→⑤ 男性4:④ 男性5:②→③

より形式的に安定結婚問題を考えると 入力:男性N人 女性N人 希望リスト N=5の例 男性: 1,2,3,4,5 女性: a,b,c,d,e 1: a c b d e a: 2 1 3 4 5 2: c a e b d b: 2 1 4 5 3 3: b a e d c c: 1 2 3 5 4 4: c b d e a d: 3 1 4 2 5 5: c d b e a e: 4 3 1 2 5 男性の希望リスト        女性の希望リスト

出力 :男女間の不安定マッチングの例 1: a c b d e a: 2 1 3 4 5 2: c a e b d b: 2 1 4 5 3 3: b a e d c c: 1 2 3 5 4 4: c b d e a d: 3 1 4 2 5 5: c d b e a e: 4 3 1 2 5 1 a 2 b 3 c 4 d 5 e 男性 1 と女性 c は ブロッキングペア ブロッキングペアの存在しないマッチング:  安定マッチング これは解の条件を満たしていない。 安定結婚問題: 与えられた入力から、安定マッチングを見つける。

The Gale-Shapley Algorithm [Gale & Shapley 1962]     (Men-propose) × 1: a c b d e a: 2 1 3 4 5 2: c a e b d b: 2 1 4 5 3 3: b a e d c c: 1 2 3 5 4 4: c b d e a d: 3 1 4 2 5 5: c d b e a e: 4 3 1 2 5 × × × × × × × Theorem [Gale & Shapley 1962, Gusfield & Irving 1989]   The Gale-Shapley algorithm finds a stable matching.