90 likes | 249 Views
9 章 縮小法. 杉原厚吉.(2001) . 「データ構造とアルゴリズム」 . 東京:共立出版. 情報知能学科 「アルゴリズムとデータ構造」 担当:白井英俊. 9 章の目的. 5 章で分割統治法を学んだ 分割統治法は、問題を小問題に分解して解くアルゴリズム設計原理 小問題の大きさの合計が元の問題の大きさより小さい場合の分解法を「縮小法」という 縮小法は、特に効率的なアルゴリズムとなる. 9.1 問題の規模縮小化. 分割統治法: 大きさ大きさ n の問題を、 a 個の小問題に分割し、それぞれの小問題の大きさが n/b になる場合を考えた. 問題全体
E N D
9章 縮小法 杉原厚吉.(2001).「データ構造とアルゴリズム」. 東京:共立出版. 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
9章の目的 • 5章で分割統治法を学んだ • 分割統治法は、問題を小問題に分解して解くアルゴリズム設計原理 • 小問題の大きさの合計が元の問題の大きさより小さい場合の分解法を「縮小法」という • 縮小法は、特に効率的なアルゴリズムとなる
9.1 問題の規模縮小化 • 分割統治法: 大きさ大きさnの問題を、a個の小問題に分割し、それぞれの小問題の大きさがn/bになる場合を考えた 問題全体 (サイズn) 小問題(n/b) 小問題(n/b) a個 … 小問題(n/b) 縮小法:n >a*(n/b) となるように問題を分解 延べサイズ=a * (n/b)
問題の規模縮小化 • より一般に… 大きさnの問題Pが、Pと同じ形式の小問題P1, P2, …, Pkに分解でき、それぞれの小問題の大きさがs1*n,s2*n,…, sk*nであり 0 < s1, s2, …, sk < 1、かつ s1+s2+…+sk< 1 (9.1) 問題の大きさがn0 以下の場合は分解しないとする。 計算時間をf(n)とおくと (9.2) f(n) = c (n ≦ n0 ) f(s1*n)+ f(s1*n)+… f(s1*n)+c*n (n >n0 ) を満たすとき、 f(n) = O(n)
9.2 定順位要素の抽出 問題:n個の実数の集合S={x1, x2, …, xn}と整数kが与えられた時、Sの中で小さい方から順位がk番目の要素を抽出する 素直な解き方: Sをソートしてk番目の要素を取 り出す 計算量はO(n logn) よりよい方法: 縮小法を用いる。 ソートしないので、計算量はO(n)
縮小法による定順位要素の抽出 アルゴリズム Order(S, k) • |S|<100 のとき、Sの要素をソートし、k番目の要素を取り出して処理を終了 • |S| ≧100 のとき(n= |S| とする) • Sの要素を5個ずつのグループにわけ、各グループの中から順位3番目のものを取り出し、それらを集めた集合をTとする • m ← Order(T, ) • Sをmより小さいものの集合S1 、 mと等しいものの集合S2 、mより大きいものの集合S3 へ分割 • k ≦ |S1| なら y←Order(S1, k) |S1| < k ≦ |S1| +|S2|なら y ←m |S1| +|S2| < k なら y←Order(S3, k -|S1| - |S2|) ⑤ yを出力して処理を終了 5個ずつのグループの3番目の要素だから、 そのグループの中央値 Tの個数はn/5ある mは中央値の中央値
実習 • 縮小法による定順位要素の抽出は、かなり要素数が大きい集合に対するもの。 • ここでは「感触」をつかんでもらうため、アルゴリズムにおける「100を10で置き換え」て、以下のデータに対し試してみよう。(n=30, k=10) 056, 927, 234, 048, 804, 055, 565, 585,333, 250, 457, 369, 552, 488, 642, 274, 500, 783, 812, 984, 087, 528, 749, 092, 043, 618, 194, 796, 123, 196
実習(続き) 30/10=3番目の要素 5個ずつのグループ 048, 056, 234, 804, 927 S= { { 056, 927, 234, 048, 804 }, { 055, 565, 585,333, 250 }, { 457, 369, 552, 488, 642 }, { 274, 500, 783, 812, 984 }, { 087, 528, 749, 092, 043 }, { 618, 194, 796, 123, 196 } } 055, 250,333, 565, 585 369, 457, 488, 552, 642 043, 087, 092, 528, 749 123, 194, 196, 618, 796 3番目の要素 これに続けて試してみよう!
計算量の問題 • 定順位要素の抽出は次のようにしてもO(n)で実行できる(?)。この方法と縮小法との計算量を比較せよ。 • 手続き: 入力:n個の数の集合S、出力:小さい方からk番目の要素 • 最初のk個をソートしておく。それをTとする。 • (n-k)個の要素それぞれ(xとする)に対し、Tの最大要素(yとする)と比較。小さい時に限り、T-{y}+{x} (Tからyを取り除きxを足した集合)をソートする。 • Tの最大要素が答え。 最大要素だけが重要なのでヒープを使うと効率的