参考:大きい要素の処理.

Slides:



Advertisements
Similar presentations
授業展開#12 コンピュータの扱いにくい問 題. 扱いにくい問題  処理時間がかかる。  メモリを大量に必要とする。  プログラムの優劣、アルゴリズムの優劣 を比較するためには、標準的なコン ピュータで比較する必要がある。  処理時間を計るのに、コンピュータのモ デルとして、チューリングマシンを考え、
Advertisements

逐次ソート 2011/05/16. ソート(sort) 順序集合の要素a 1 … a n の上下関係を整 える 一般的には、整数の集合 N を考えればよ い ソートの計算量が問題となる どのような入力に対し、どのようなアル ゴリズムが最適か?
4.3 マージソート.
4.ソート問題とアルゴリズム 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
離散システム特論 整列(sorting)アルゴリズム 2.
ヒープソートの演習 第13回.
アルゴリズムイントロダクション第2章 主にソートに関して
4.ソート 4-1.ソート問題について 4-2.簡単なソートアルゴリズム 4-3.高度なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月27日
第12回 ソート(3): シェルソート、クイックソート
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
第11回 整列 ~ シェルソート,クイックソート ~
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
4-3:高度なソートアルゴリズム① (分割統治法にもとづくソート)
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
5.チューリングマシンと計算.
5.チューリングマシンと計算.
アルゴリズムとデータ構造 第6回演習解答 2015/11/18実施 アルゴリズムとデータ構造 2015.
4.整列のアルゴリズム.
第10回 ソート(1):単純なソートアルゴリズム
データ構造とアルゴリズム 分割統治 ~ マージソート~.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
ヒープソートの復習.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第11回 整列 ~ シェルソート,クイックソート ~
二分探索木によるサーチ.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2005年7月15日
講義では、Cプログラミングの基本を学び 演習では、やや実践的なプログラミングを通して学ぶ
わんくま同盟茶藝部顧問 Microsoft MVP for VC episthmh
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとプログラミング (Algorithms and Programming)
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング 4 探索と計算量.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造 2011年6月23日
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
5.サーチ 5-1.線形探索 5-2.2分探索 5-3.ハッシュ.
プログラミング 3 2 次元配列.
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
5.チューリングマシンと計算.
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2011年6月28日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
アルゴリズムとデータ構造 2013年7月2日
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
4.プッシュダウンオートマトンと 文脈自由文法の等価性
アルゴリズムとデータ構造 2012年6月25日
ヒープソート.
ヒープソート.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 変数宣言、初期化について
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
プログラミング論 バイナリーサーチ 1.
Presentation transcript:

参考:大きい要素の処理

ちょっと寄り道 (一個一個が大きいデータを処理する工夫) 配列A A[0] A[1] A[i] A[n-1] A[j] 名前、 生年月日、 住所、 経歴、 趣味 A[j] A[i] 交換は大変

大きいデータを処理する工夫2 工夫:大きいデータは動かさずに、 たどり方だけがわかればいい。 data1 data2 配列A A[0] A[1] A[i] A[n-1] 1 i n-1 配列B B[0] B[1] B[i] B[n-1] 添字の配列Bだけを操作して、配列Aは動かさない。 swap(&B[0],&B[i]); (data1が最小値のとき。) data2 data1 配列A A[0] A[1] A[i] A[n-1] i 1 n-1 配列B B[0] B[1] B[i] B[n-1]

大きいデータを処理する工夫3 イメージ data1 data2 配列A A[0] A[1] A[i] A[n-1] data1 data2 配列A A[0] A[1] A[i] A[n-1] ソート順は、下の情報からえられる。 (配列の添字の利用だけでなく、ポインタでも同様のことができる。)

実現 細かい部分は省略します。 void selection_sort(struct data A[]){ int B[N]; /*配列Aの要素を指す*/ int i,j; /*カウンタ*/ for(i=0;i<N;i++){ B[i]=i; } min=i; for(j=i+1;j<N;j++){ if(A[B[min]].item>A[B[j]].item){ min=j; swap(&B[i],&B[min]); return;

4-4:比較によらないソート

比較によらないソート バケットソート データが上限のある整数のような場合に用いる。 データの種類が定数種類しかない場合には、 関数で整数に写像してから用いてもよい。 (ハッシュ関数) 基数ソート 大きい桁の数に対して、 桁毎にバケットソートをしてソートする。

バケットソート とりあえず、簡単のために、 データは、 1.重複がなく、 2. 0からm-1の整数 という性質を満足するとしましょう。 (例えば、学籍番号の下2桁とか。) 方針 m個のバケット(配列)を用意して、 データを振り分けていく。 データそのものを配列の添字として使う。

バケットソートの動き1 2 4 3 6 1 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 -1 -1 -1 -1 3 6 1 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 -1 -1 -1 -1 -1 配列B B[0] B[1] B[2] B[3] B[m-1] 6 1 2 4 3 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 3 -1 -1 -1 -1 配列B B[0] B[1] B[2] B[3] B[m-1] 6 1 2 4 3 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 3 -1 -1 6 -1 配列B B[0] B[1] B[2] B[3] B[6] B[m-1]

バケットソートの実現 /*概略です。細かい部分は省略 入力データの配列の型がintであることに注意*/ void bucket_sort(int A[],int B[]) { int i; /*カウンタ*/ for(i=0;i<n;i++) B[A[i]]=A[i]; } return;

バケットソートの動き2(添字を用いた場合) 2 4 3 6 1 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 -1 -1 -1 -1 -1 配列B B[0] B[1] B[2] B[3] B[m-1] 3 6 1 2 4 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 -1 -1 -1 -1 配列B B[0] B[1] B[2] B[3] B[m-1] 3 1 6 2 4 配列A A[0] A[1] A[i] A[n-1] -1 -1 -1 3 -1 -1 -1 1 配列B B[0] B[1] B[2] B[3] B[6] B[m-1]

バケットソートの実現2 /* 配列の添字を用いて、間接的にソート*/ void bucket_sort(int A[],int B[]) { int i; /*カウンタ*/ for(i=0;i<n;i++) B[A[i]]=i; } return; i番目のデータの参照は、A[B[i]]で行う。

バケットソートの計算量 配列1回のアクセスには、定数時間で実行できる。 繰り返し回数は、明らかにデータ数n回です。 また、 配列Bの準備や、走査のために、 の時間量必要です。 最悪時間量 のアルゴリズムです。

基数ソート 方針 大きい桁の数に対して、 桁毎にバケットソートをしてソートする。 下位桁から順にバケットソートする。

基数ソートの動き(3桁) A A A A 650 2 2 221 250 650 106 23 1 1 1 1 215 2 23 2 221 2 2 33 3 2 3 2 3 221 3 47 0桁で ソート 23 4 106 4 372 4 4 106 1桁で ソート 226 2桁で ソート 5 226 5 23 5 5 126 6 250 6 33 6 126 6 215 7 126 7 215 7 33 7 221 372 106 47 226 8 8 8 8 47 226 650 250 9 9 9 9 215 126 250 372 10 10 10 10 372 33 47 650 11 11 11 11

練習 次の配列に基数ソートを適用したときの動作を示せ。 A 123 32 1 2 612 3 4 4 821 5 621 6 100 7 123 32 1 2 612 3 4 4 821 5 621 6 100 7 754 253 8 558 9 56 10 234 11

基数ソートの実現 /*細かい実現は省略*/ void radix_sort(int A[]) { int i,j; /*カウンタ*/ for(k=0;k<max_k;k++) bucket_sort(A,k); /*第k桁を基にして、バケットソートでソートして、 もとの配列に戻すように拡張する。*/ } return;

基数ソートの計算量 バケットソートを桁数分行えばよいので、 k桁数を基数ソートするには、 最悪時間量 のアルゴリズムです。 また、 桁必要です。 種類のデータを区別するには、 のときには、 結局 の時間量を持つアルゴリズムです。 だから、バケットソートや基数ソートは、 データ範囲mや、桁数kに注意しましょう。

4-5:ソート問題の下界

問題とアルゴリズム 具体的なアルゴリズムを作ることは、 問題の難しさ(問題固有の計算量)の上界を与えています。 最適なアルゴリズムの存在範囲 アルゴリズムがない問題は、難しさがわからない。 ソート問題 の難しさ バブルソート発見 ソート問題 の難しさ マージソート発見 ソート問題 の難しさ

問題と下界 一方、問題の難しさの範囲を下の方から狭めるには、 問題を解くアルゴリズムが無いことを示さないといけない。 実は、1つのアルゴリズムを作ることより、アルゴリズムが存在 しないことを示すことの方が難しい。 最適なアルゴリズムの存在範囲 ソート問題 の難しさ ? ソート問題 の難しさ ? アルゴリズムが 存在しない。 ソート問題の場合は、なんとか示せます。

アルゴリズムと決定木 (比較によるソートの下界証明の準備) 決定木の根:初期状態 決定木の節点:それまでの計算の状態 決定木の枝 :アルゴリズムの進行による状態の遷移 決定木の葉:終了状態 初期状態 状態遷移 (ヒープのような)データ構造の木ではなくて、 概念的、抽象的なもの。 根がアルゴリズムの初期状態に対応し、 葉がアルゴリズム終了状態に対応し、 根からの道がアルゴリズムの実行順に対応し、 根から葉までの道の長さが時間量に対応する。 終了状態

決定木の例(挿入ソート) 大 小 true false false true false true false false true true

決定木の例(バブルソート) 大 小 true false false true false true false false true true true true

練習 (1)3要素の選択ソートのアルゴリズムに対応する 決定木を作成せよ。 (2)4要素の決定木を作成せよ。 (どんなアルゴリズムを用いても良い。)

ソート問題の下界 どんな入力でもきちんとソートするには、 決定木にn!個以上の葉がなければならない。 それで、アルゴリズムの比較回数は、 決定木の高さで定まる。 最悪時間が良いアルゴリズムは高さが低く、 悪いアルゴリズムは高さが高い。 高さがhの決定木では、高々 個の葉 しかない。 よって、 よって、 ソートアルゴリズムでは少なくとも の時間量が必要である。

ソート問題の難しさ ソート問題 の難しさ 決定木による証明 アルゴリズム開発 (マージソート ヒープソート等) こんなことを考えるのが、 計算量理論の分野です。