酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造 2011年6月30日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2011/index.html.

Slides:



Advertisements
Similar presentations
小規模事業者の みなさま ▼ 小規模事業者持続化補助金は、以下のような取組に使える補助金です ▼ ①小規模事業者持続化補助金 小規模事業者の経営計画に基づく経営を推進するため、経営計画を作成し、それ に基づく販路開拓の取り組みを支援します。経営計画策定やフォローアップにあ たっては、商工会・商工会議所が支援を行います。
Advertisements

ロックンロール県庁所在地 初球日本語会話. 県庁所在地 都道府縣廳所在地是日本的都廳、道廳、 府廳、縣廳的設置場所,根據地方自治法 第四條與都道府縣條例而設立。日本地方自治法都道府縣 都道府縣廳所在地是各都道府縣行政機關 與國家機關的集中地,行政的中心地,都 道府縣議會所在的地方自治中心地。縣廳 所在地稱為縣都、道廳所在地稱為道都。行政機關地方自治.
47 都道府県 日本地理 南台科技大學 應用日語系 担当:山藤夏郎 2 47 都道府県 日本の行政区分 47 の都道府県がある。 47 の都道府県がある。 1都1道2府 43 県 1都1道2府 43 県 都(と) … 首都 都(と) … 首都 道(どう) … 地方 道(どう) … 地方 府(ふ)
都道府県の 位置と名称 都道府県の 位置と名称 はじめ る. 北海道 道庁所在地は? 北海道の道庁所在地は 札幌市.
並び替え. 名古屋市 県 名県 名 県庁所在地 中部地方 ( 東海) 秋田市 県 名県 名 県庁所在地 東北地方.
並び替え. 名古屋市 県 名県 名 県庁所在地 秋田市 県 名県 名 県庁所在地 青森市 県 名県 名 県庁所在地.
4 府市のガバナンス (2)基礎自治体機能の充実 ○ 都道府県人口と比較した、大阪市の位置づけ ○ 政令市と比較した、大阪市の位置づけ ○ 主要政令市の比較 ○ 住民リコール等の状況 ○ 議員定数比較 ○ 特別区、一般市及び行政区との比較 ○ 主要政令市における区長の権限・住民自治の仕組 み・ 区役所の事務.
摂食嚥下に関連する問題に対応 可能な医療資源に関する調査報 告. 目的:摂食嚥下に関連する問題に対して有効な支援が受 けられる体制を整備するために、これら問題に対応 可能な医療資源を全国規模でマッピングする。 登録が十分でない地域、資源を明らかにして、 登録を促進しマッピングを充実させる。 方法:
2010年7月 読者プロファイル 株式会社毎日コミュニケーションズ 出版事業本部広告部 TEL:
とちぎ元気キッズ がんばりカード 1・2年生 チャレンジ 栃木県25の市と町めぐり 栃木県教育委員会 あなたの1日の目ひょう
アルゴリズムとデータ構造 2012年6月27日
アルゴリズムとデータ構造1 2008年7月22日
JGN2ネットワーク概要 *IX:Internet eXchange AP:Access Point H19年8月現在 札幌 仙台 金沢
H28改定後の全国の届出動向 2167施設が届出 1 愛知256 2 広島199 3 兵庫
骨太の方針2015について 経済財政運営と改革の基本方針2015 ~経済再生なくして財政健全化なし~ (抄)
地域再生中小企業創業助成金のご案内 創業経費に対する助成 雇入れに対する助成 厚生労働省、道県労働局、ハローワーク
(経営改善支援センター・中小企業再生支援協議会)
@15円でご提供 86.1%! Potora ポテンシャルニーズ(1~3月版) ご好評いただいているポテンシャルニーズの最新版です。
平成25年2月9日 青森県内40市町村における 公共施設の喫煙対策状況 青森県タバコ問題懇談会 鳴海 晃、新谷 進一.
(経営支援型セーフティネット貸付・借換保証制度)
Travel plan 今回の 旅プラン 旅のメンバー 鈴木 健太 佐藤 まいこ 鈴木 健太 佐藤 まいこ
図1 習慣的喫煙者割合(男)の年次推移と平成358年までの外挿 直線近似および対数近似
熊本県のハートフルパス が 全国31府県で利用可能に!
@15円でご提供 88.5%! Potora ポテンシャルニーズ(4~6月版) 平均CTR実績 初回ご出稿に限り
教育情報の多変量解析 データの視覚化 データの分類 2変数群間の関係 その他.
アルゴリズムとデータ構造 2011年6月13日
@Minako Wakasugi, MD, MPH, PhD
データ構造とアルゴリズム 分割統治 ~ マージソート~.
アルゴリズムとデータ構造 2012年7月5日
1 平成28年11月1日現在配備状況 76機(45都道府県、55団体)
アルゴリズムとデータ構造 2011年6月20日
ファストパス制度のご案内 海外展開一貫支援
KOHKU SHUHAI SERVICE NARITA DELIVERY NETWORK 翌日配送 翌々日配送 札幌 20:00発
<無菌調剤> 無菌調剤は、受け付けることができる施設を見つけていち早く業務に取り掛かかれるようにしておくことが大切である。
Travel plan 今回の 旅プラン 旅のメンバー 鈴木 健太 佐藤 まいこ 鈴木 健太 佐藤 まいこ
災害廃棄物発生量の推計精度 向上のための方策検討 環境再生・資源循環局 災害廃棄物対策室 平成30年3月13日 資料 3-6
ギガビットネットワーク通信回線構成図 札幌 仙台 金沢 長野 岡山 天神 淡路 大手町 高松 名古屋 北海道大学 600M 岩見沢自治体
無 期 転 換 ル ー ル 緊 急 相 談 ダイヤル 無期転換ルールに関するあらゆるご相談を受け付けています。
【演習4】の進行(225分) ※途中休憩有り No 項目 内容 時間 1 演習についての説明 演習の進行方法について確認 5分 2
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造1 2005年7月15日
県名ゲームの遊び方 マウスをクリックまたはENTERキーを押すと始まり、どんどん進んでいきます。
アルゴリズムとデータ構造1 2005年7月1日
平成24年度 臨床研修医 都道府県別採用実績について
一般常識問題 問題 18.
21世紀は、EBPH (Evidenced Based Public Health)
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
フッ化物洗口実施状況の推移 (日本むし歯予防フッ素推進会議調べ)
平成25年度 障害者虐待防止法に係る 大阪府の対応状況について
「産婦人科医療改革 公開フォーラム」平成26年1月26日
「産婦人科医療改革 公開フォーラム」平成26年1月26日
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
無 期 転 換 ル ー ル 緊 急 相 談 ダイヤル 無期転換ルールに関するあらゆるご相談を受け付けています。
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2013年7月1日
アルゴリズムとデータ構造 2013年7月2日
8月よりチラシの納品先が変更になりました。
医療観察法の運用状況について    医療観察法は、心神喪失又は心神耗弱の状態(精神障害のために善悪の区別がつかないなど、刑事責任を問えない状態)で、重大な他害行為(殺人、放火、強盗、強姦、強制わいせつ、傷害)を行った人に対して、適切な医療を提供し、社会復帰を促進することを目的とした制度である 1.指定入院医療機関の整備状況.
アルゴリズムとデータ構造 2012年6月25日
アルゴリズムとデータ構造 2012年6月21日
地方公共団体のオープンデータ取組済み(※)数の推移
平成26年度 障害者虐待防止法に係る 大阪府内の対応状況について
「産婦人科医療における格差是正に向けて」
Presentation transcript:

酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造 2011年6月30日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2011/index.html

マージソート(198ページ) 手続きf(p) 問題pを半分にする それぞれの部分問題に対して次の処理 半分にした問題をマージする 部分問題の要素数が2個 小さい順に並び替える→次の処理へ 部分問題の要素数が1個 並び替える必要が無い→次の処理へ 部分問題の要素数が2個より多い 手続きfを部分問題を引数に呼ぶ 半分にした問題をマージする 部分問題列の先頭から、小さい順に取り出す

69 11 84 63 76 91 53 97 41 2 28 31 58 19 12 88 53 69 69 11 84 84 63 97 97 76 91 91 12 53 41 84 2 28 28 31 63 58 97 19 88 88 41 69 11 58 91 76 12 53 2 31 88 19 41 76 28 63 12 58 11 31 2 19 2 11 12 19 28 31 41 53 58 63 69 76 84 88 91 97

マージソート (逐次処理, 201ページ) データの分割にかかる時間(2要素に分解) n/2 ソートにかかる時間(段数log2n, データ数n)   n log2n ステップ数は n/2 + n log2n つまり O(n logn)   クイックソートと並ぶオーダーで処理ができる

作業領域を余分に必要とする 空間計算量がO(n)になる public class StraightMergeSort { private final static <E extends Comparable<E>> int merge(int seqsize, E[] from, E[] into){ int n = 0; for(int start = 0; start < from.length;){ int i = start; int j = start + seqsize; int iend = Math.min(start + seqsize, from.length); int jend = Math.min(start + 2*seqsize, from.length); while((i < iend) && (j < jend)){ n++; into[start++] = (from[i].compareTo(from[j]) <= 0)? from[i++]: from[j++]; } while(i < iend) into[start++] = from[i++]; while(j < jend) into[start++] = from[j++]; return n; public static <E extends Comparable<E>> int sort(E[] array) { E[] work = (E[])Array.newInstance(array.getClass().getComponentType(), array.length); for(int seqsize = 1; seqsize <= array.length; seqsize *= 4){ n += merge(seqsize, array, work); n += merge(seqsize*2, work, array); 作業領域を余分に必要とする 空間計算量がO(n)になる

兵庫, 北海道, 東京, 沖縄, 青森, 高知, 鹿児島, compareTo()を呼んだ回数 14 private final static String[] test_data_string = { "東京", "北海道", "高知", "兵庫", "鹿児島", "沖縄", "青森“ }; private final static Integer[] test_data_int = { 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10 public static void main(String[] args) { int n; StringBuffer sb = new StringBuffer(); String[] data1 = test_data_string.clone(); n = sort(data1); for (String e : data1) { sb.append(e).append(", "); } sb.append("\ncompareTo()を呼んだ回数 ").append(n).append('\n'); Integer[] data2 = test_data_int.clone(); n = sort(data2); for (Integer e : data2) { System.out.print(sb.toString()); 兵庫, 北海道, 東京, 沖縄, 青森, 高知, 鹿児島, compareTo()を呼んだ回数 14 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88, compareTo()を呼んだ回数 36

分割統治法(162ページ) 元の問題をサイズの小さいいくつかの部分問題に分割 個々の部分問題を何らかの方法で解決 それらの解を統合することで元の問題の解を得る

比較を使わないソート ビンソート(215ページ) ビン(瓶ではない、bin = 箱)を使う データの持つ性質を利用する 例:情報の2年生の学生番号(範囲が限られる) ビンをデータの取りうる範囲分確保する データをビンに仕分ける 仕分け完了=ソート完了なので出力

データは0から8までの範囲であるということが事前にわかっている場合 0から8までのビンを用意する 1 2 3 4 7 3 6 8 3 2 5 6 7 8 ビン

出現回数を数えることによる整列アルゴリズム (215ページ) 0からmaxまでの値がそれぞれ何回現れるか数える。 これを元にその値以下の値の個数を計算する。 入力のそれぞれの値が出力のどの位置に収まるかを計算し出力する。 public class CountSort { public static <E extends Number> void sort(E[] array, int max) { int[] count = new int[max + 1]; E[] original = array.clone(); for(E e: original){ count[e.intValue()]++; // 出現回数 } for(int i = 1; i < count.length; i++){ count[i] += count[i-1]; // 順位付け int j = --count[e.intValue()]; array[j] = e; 作業領域を余分に必要とする

ビンソートのプログラム(216ページ) データを入れるビンの実装にリストを使う。ビンは配列として並べる。 入力データを対応するビンに仕分ける。 ビンを順に取り出し、ビンの中のデータを順に出力する。 public class BinSort { public static <E extends Number> void sort(E[] array, int max) { List<E>[] bin = new List[max + 1]; for(E e: array){ if(bin[e.intValue()] == null){ bin[e.intValue()] = new LinkedList<E>(); } bin[e.intValue()].add(e); int i = 0; for(List<E> l: bin){ if(l != null){ for(E e: l){ array[i++] = e; 作業領域を余分に必要とする

ビンに仕分けて、取り出すだけ。 時間計算量は良い。 空間計算量は良くない。 private final static Double[] test_data_double = { 47.0, 18.1, 8.2, 7.3, 2.4, 4.5, 9.6, 0.7, 72.8, 88.9, 2.0, 5.1, 9.2, 10.3, }; private final static Integer[] test_data_int = { 47, 18, 8, 7, 2, 4, 9, 0, 72, 88, 2, 5, 9, 10, public static void main(String[] args) { StringBuffer sb = new StringBuffer(); Double[] data1 = test_data_double.clone(); sort(data1, 88); for (Double e : data1) sb.append(e).append(", "); sb.append('\n'); Integer[] data2 = test_data_int.clone(); sort(data2, 88); for (Integer e : data2) sb.append(e).append(", "); System.out.print(sb.toString()); } ビンに仕分けて、取り出すだけ。 時間計算量は良い。 空間計算量は良くない。 CountSortの結果 0.7, 2.0, 2.4, 4.5, 5.1, 7.3, 8.2, 9.2, 9.6, 10.3, 18.1, 47.0, 72.8, 88.9, 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88, BinSortの結果 0.7, 2.4, 2.0, 4.5, 5.1, 7.3, 8.2, 9.6, 9.2, 10.3, 18.1, 47.0, 72.8, 88.9, 0, 2, 2, 4, 5, 7, 8, 9, 9, 10, 18, 47, 72, 88,

(配列の添え字をJavaに合わせてみました。) 基底法(218ページ) 辞書式順序によりソートするために使えるアルゴリズム 辞書式順序で文字列xがyより小さいとは、  以下のいずれかの条件を満たす場合のこと。 かつ (配列の添え字をJavaに合わせてみました。)

余談: 教科書の書かれた時代に、このような実装をすると怒られた。 public class RadixSort { public static <E extends CharSequence> void sort(E[] array, int k) { List<E>[] bin = new List[Character.MAX_VALUE + 1]; while(--k >= 0){ for(E e: array){ int index = 0; if(k < e.length()){ index = e.charAt(k); } if(bin[index] == null){ bin[index] = new LinkedList<E>(); bin[index].add(e); int i = 0; for(List<E> l: bin){ if(l != null){ for(E e: l){ array[i++] = e; l.clear(); } 余談: 教科書の書かれた時代に、このような実装をすると怒られた。 当時のPCの主記憶は640KBしかなく、要素数64Kの配列を確保するとは非常識ということ。 今では常識的な大きさなので気にすることはない。 そもそもJavaがなかったし、C言語のC89規格が決まったかどうかというくらい昔の話。 もしかしてみなさん生まれてない?

private final static String[] test_data_prefecture = { "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県", }; private final static String[] test_data_direction = { "北", "北微東", "北北東", "北東微北", "北東", "北東微東", "東北東", "東微北", "東", "東微南", "東南東", "南東微東", "南東", "南東微南", "南南東", "南微東", "南", "南微西", "南南西", "南西微南", "南西", "南西微西", "西南西", "西微南", "西", "西微北", "西北西", "北西微西", "北西", "北西微北", "北北西", "北微西", public static void main(String[] args) { StringBuffer sb = new StringBuffer(); String[] data; data = test_data_prefecture.clone(); sort(data, 4); // 最初の4文字でソートする。 for (String e : data) sb.append(e).append(", "); sb.append('\n'); data = test_data_direction.clone(); System.out.println(sb.toString()); }

RadixSortの結果 三重県, 京都府, 佐賀県, 兵庫県, 北海道, 千葉県, 和歌山県, 埼玉県, 大分県, 大阪府, 奈良県, 宮城県, 宮崎県, 富山県, 山口県, 山形県, 山梨県, 岐阜県, 岡山県, 岩手県, 島根県, 広島県, 徳島県, 愛媛県, 愛知県, 新潟県, 東京都, 栃木県, 沖縄県, 滋賀県, 熊本県, 石川県, 神奈川県, 福井県, 福岡県, 福島県, 秋田県, 群馬県, 茨城県, 長崎県, 長野県, 青森県, 静岡県, 香川県, 高知県, 鳥取県, 鹿児島県, 北, 北北東, 北北西, 北微東, 北微西, 北東, 北東微北, 北東微東, 北西, 北西微北, 北西微西, 南, 南南東, 南南西, 南微東, 南微西, 南東, 南東微南, 南東微東, 南西, 南西微南, 南西微西, 東, 東北東, 東南東, 東微北, 東微南, 西, 西北西, 西南西, 西微北, 西微南,

アルゴリズムとデータ構造 演習 学生番号: 名前: アルゴリズムとデータ構造 演習 学生番号:                    名前:                 前提: 同じ値を持つデータをソートした場合に、 ソート結果にその入力順が保存されるアルゴリズムを 「安定なアルゴリズム」という。 現状: ところが、プログラム例のCountSortでは、 本来は安定なアルゴリズムにできるはずのところが、 そうなっていない。BinSortの結果と同じになるべき。 問題:安定なアルゴリズムを実装するように、CountSortのプログラムリストを修正せよ。 解答はプログラムリストの該当箇所を二重線で消したり追記したりすることで直接書き込むこと。

public class CountSort { public static <E extends Number> void sort(E[] array, int max) { int[] count = new int[max + 1]; E[] original = array.clone(); for(E e: original){ count[e.intValue()]++; // 出現回数 } for(int i = 1; i < count.length; i++){ count[i] += count[i-1]; // 順位付け int j = --count[e.intValue()]; array[j] = e;