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

Similar documents
alg2015-3r3.ppt

Microsoft PowerPoint - 6.pptx

第2回

alg2015-4r2.ppt

Microsoft PowerPoint - 06.pptx

PowerPoint Template

Microsoft PowerPoint - 05.pptx

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

プログラミングI第10回

PowerPoint プレゼンテーション

memo

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - kougi9.ppt

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Taro-リストⅢ(公開版).jtd

計算機ソフトウエア

第3回 配列とリスト

Taro-リストⅠ(公開版).jtd

Microsoft Word - no205.docx

4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE データ抽象 (data abstraction) 目的 : データ構造を ( 実装に依存せずに ) 抽象的に定義 方法 : データにアクセス (read, write) する関数の仕様

DA02

Microsoft PowerPoint - algo ppt [互換モード]

memo

memo

CプログラミングI

Microsoft Word - 中間試験 その1_解答例.doc

Microsoft Word - no206.docx

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Microsoft Word - no12.doc

memo

文字列操作と正規表現

PowerPoint Presentation

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

PowerPoint プレゼンテーション

Microsoft Word - 3new.doc

Microsoft Word _VBAProg1.docx

Prog1_10th

Taro-ポインタ変数Ⅰ(公開版).j

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

第3回 配列とリスト

memo

Taro-スタック(公開版).jtd

PowerPoint Presentation

模擬試験問題(第1章~第3章)

Microsoft PowerPoint - kougi10.ppt

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

gengo1-11

Microsoft PowerPoint - ad11-09.pptx

book-review.dvi

PowerPoint プレゼンテーション

02: 変数と標準入出力

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft Word - no202.docx

Microsoft PowerPoint - lec10.ppt

memo

Microsoft PowerPoint - handout07.ppt [互換モード]

02: 変数と標準入出力

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

02: 変数と標準入出力

データ構造

Microsoft PowerPoint - PLT3.ppt

ex04_2012.ppt

Microsoft PowerPoint - 5Chap15.ppt

DA13

微分方程式 モデリングとシミュレーション

02: 変数と標準入出力

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

講習No.9

10-vm1.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

20分でわかる Purely Functional Data Structures

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

プログラミングI第5回

Microsoft PowerPoint - prog13.ppt

ex05_2012.pptx

program7app.ppt

デジタル表現論・第4回

Microsoft PowerPoint - Pro110111

PowerPoint Presentation

Microsoft PowerPoint - prog03.ppt

JavaプログラミングⅠ

02: 変数と標準入出力

/ SCHEDULE /06/07(Tue) / Basic of Programming /06/09(Thu) / Fundamental structures /06/14(Tue) / Memory Management /06/1

Microsoft PowerPoint pptx

PowerPoint Presentation

Microsoft PowerPoint - OS07.pptx

情報処理Ⅰ演習

O(N) ( ) log 2 N

PowerPoint プレゼンテーション - 物理学情報処理演習

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

第2回

メソッドのまとめ

PowerPoint プレゼンテーション

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

Transcription:

講義 アルゴリズムとデータ構造 第 3 回基本的なデータ構造 ( リスト スタック キュー ) 大学院情報科学研究科情報理工学専攻情報知識ネットワーク研究室喜田拓也 講義資料 2018/5/23

今日の内容 基本的なデータ構造リスト : 最も基本的なデータ集合の表現 配列 / 連結リスト / 双連結リストによる実装 スタック : 積み上げ式のデータ格納方式キュー : 入れた順に取り出せるデータ格納方式 ポイント ポインタを用いたデータ構造 抽象データ型とその実装 2

抽象データ型 (Abstract Data Type) データ型を, それに適用される一連の操作で抽象的に定めたもの create insert delete 抽象データ型 データ たとえば Linked list データとその操作をカプセル化することのメリット 定められた正しい方法でのみデータがアクセスされる 不正な操作からデータを保護することができる ユーザはデータ構造の実現方法について知る必要がない プログラマは他の部分とは独立して内部を実現することができる 3

リストとは? 0 個以上の要素を一列にならべたもの リスト LL 太郎 二郎 花子 道子 LL 1 LL 2 LL 3 LL 4 要素 LL ii : 最初から ii 番目の要素 (1 ii nn) リスト中の場所を指示するための 位置 をもつリストの長さ : 要素数 nn 空リスト : 要素を含まないリストのこと 4

リストに対する操作 リスト LL 太郎 二郎 花子 道子 LL 1 LL 2 LL 3 LL 4 INSERT(xx, pp, LL) : リスト LL( 要素数 nn) の位置 pp の次の位置に 要素 xx を挿入 DELETE(pp, LL) : リスト LL の位置 pp の次の要素を削除 FIND(ii, LL) : リスト LL の ii 番目のセルの内容を返す LAST(LL) : リスト LL の最後のセルの位置を返す PREVIOUS(pp, LL) : リスト LL において 位置 pp の 1 つ前のセルの 位置を返す ここで 位置 pp とはメモリ上の位置を指し示すポインタのこと 5

ポインタ (pointer) ってなに? ポインタ pp データ xx セルの位置を示すデータ AA 機械語レベルではセルの番地とセルの型情報の組プログラミングにおいては, その値を具体的に知る必要はない ポインタ p 132 値 x 5 C 言語の場合 ポインタ p が指す変数の値を, *p で取り出せる 変数 x のアドレス ( 格納場所 ) は &x で参照できる 6

リストの実装の方策 1. 配列 (array) : メモリ上の nn 個の連続領域に格納 1 2 3 4 nn LL 1 LL 2 LL 3 LL 4 LL nn 2. 連結リスト (linked list): ポインタで次の要素の格納領域を指す init LL 1 LL 2 LL nn 3. 双方向連結リスト (doubly linked list): 2 個のポインタで前後を指す init LL 1 LL 2 LL nn last 7

連結リストによるリストの実装 (C 言語版 ) typedef struct cell { int element; struct cell *next; } cell; cell *init=null; // 空のリスト void list_add(int x) { // 整数要素 x を先頭へ追加 cell *new= (cell *)malloc(sizeof(cell)); new->element=x; new->next=init; init=new; } struct cell { }: 構造体 cell を と定義 typedef cell: をデータタイプ cell 型として定義 init は cell 型データを指すポインタ型 sizeof(cell): cell 型のデータサイズ ( バイト ) malloc(n):n バイトのメモリーを確保 (cell *)malloc(n): 確保した n バイトの領域を cell 型データ格納領域とみなす 8

連結リストによるリストの実装 (C 言語版 ) つづき typedef struct cell { int element; struct cell *next; } cell; cell *init=null; // 空のリスト void list_add(int x) { // 整数要素 x を先頭へ追加 cell *new= (cell *)malloc(sizeof(cell)); new->element=x; new->next=init; init=new; } 最初に空リストができる init 最初は, どこも指していないことを示す特別な値 が入っている list_add(5) を実行すると 1 メモリ上に空のセルが作られる 2 そのセルの element 部分に値 x が入る 5 3 ポインタ next には init が指す位置が入る 5 最初に add される要素の場合は 4 init はその新しくできたセルを指す init 5 9

連結リストによるリストの実装 (C 言語版 ) つづき typedef struct cell { int element; struct cell *next; } cell; cell *init=null; // 空のリスト void list_add(int x) { // 整数要素 x を先頭へ追加 cell *new= (cell *)malloc(sizeof(cell)); new->element=x; new->next=init; init=new; } 現状のリストの様子 init 5 さらにlist_add(3) を実行すると 1 メモリ上に空のセルが作られる 2 そのセルのelement 部分に値 xが入る 3 3 ポインタ next には init が指す位置が入る 3 5 4 init はその新しくできたセルを指す init 3 5 10

双方向連結リストによるリストの実装 (C 言語版 ) 双方向連結リストによる実装 typedef struct cell { int element; struct cell *prev; struct cell *next; } cell; cell *init=null; // 空のリスト cell *final=null; void list_add(int x) { // 整数要素 x を先頭へ追加 cell *new=(cell *)malloc(sizeof(cell)); new->element=x; new->next=init; new->prev=null; if(init==null) final=new; else init->prev=new; init=new; } cell 型は 1 つ前のデータを指すポインタ prev ももつ 最後尾のデータを指すポインタ final も必要 先頭に追加する場合は 1 つ前のデータはなし 最初に格納されたデータが最後尾のデータ (final が指すデータ ) となる 2つ目以降に格納されたデータは prevポインタを新しい先頭データを指すように更新する 11

連結リストが得意な処理 ( 挿入の場合 ) 配列の場合 最悪 / 平均時間計算量は Θ(nn) p a 1 a i-1 a i a n-1 a 1 a i-1 x a i a n-1 連結リストの場合 a 1 init a i-1 a i p a n-1 a 1 init a i-1 a i a n-1 最悪 / 平均時間計算量はΘ(1) 双方向連結リストの場合 init p a i-1 a i x a n-1 final init a i-1 a i a n-1 final 最悪 / 平均時間計算量はΘ(1) x 12

連結リストが得意な処理 ( 削除の場合 ) 配列の場合 最悪 / 平均時間計算量は Θ(nn) p a 1 a i-1 a i a n-1 a i+1 a 1 a i-1 a i+1 a n-1 連結リストの場合 a i-1 p init a i a i+1 a n-1 a i-1 init a i+1 a n-1 最悪 / 平均時間計算量はΘ(1) 双方向連結リストの場合 p a i-1 a i a i+1 a i-1 a i+1 最悪 / 平均時間計算量は Θ(1) 13

配列が得意な処理 (i 番目の要素へのアクセス ) 配列の場合 連続領域であるため ii 番目の要素や前後の要素に 1 ステップでアクセス可能 FIND(i,L): Θ(1) LAST(L): Θ(1) PREVIOUS(p,L): Θ(1) a a 1 a i-1 a i a i+1 a n-1 PREVIOUS(p,L) p FIND(i,L) LAST(L) 連結リストの場合 a i-1 init a i a i+1 p a n-1 FIND(i,L): Θ(nn), LAST(L): Θ(nn), PREVIOUS(p,L): Θ(nn) 双方向連結リストの場合 init ==an-1 p a i-1 a i PREVIOUS(p,L) FIND(i,L) LAST(L) PREVIOUS(p,L) LAST(L) FIND(i,L): Θ(nn), LAST(L): Θ(1), PREVIOUS(p,L): Θ(1) final FIND(i,L) =14

配列によるコンパクトな連結リストの実現方法 連結リストを配列内に配置し, 要素が入っていないセルを管理する リストと混在させることで実現する 0 1 2 3 4 5 6 m-3 m-2 m-1 a 1 a 2 a n-1 a n-2 2 4 6 1 9-1 7 m-1 5-1 free_init 0 init 3 メリット メモリー確保 解放の時間を節約できる メモリー使用量を制御できる ガベージコレクションの必要がない INSERT 操作が Θ 1 時間でできる DELETE は Θ nn 時間 15

スタック (stack) とは? 要素の挿入 削除がいつも先頭からなされるリスト LIFO (last-in-first-out) 基本操作 TOP(SS) スタックSSの先頭の位置を返す POP(SS) スタックSSの先頭の要素を削除 PUSH(xx, SS) スタックSSの先頭に要素 xxを挿入 a 2 PUSH(a 2,S) POP(S) a 2 a 2 TOP(S) a 1 a 1 a 1 16

スタックの実現法 配列による実現 S top a 1 a i i =TOP(S) すべての操作の時間計算量は Θ(1) PUSH(a i+1,s) top i+1 POP(S) S a 1 a i a i+1 連結リストによる実現 TOP(S) = a i a i-1 top すべての操作の時間計算量は Θ(1) PUSH(a i+1,s) top a i a i-1 POP(S) a i+1 17

キュー (queue; 待ち行列 ) とは? 要素の挿入は最後尾 削除は先頭からなされるリスト 基本操作 TOP(QQ) ENQUEUE(xx, QQ) DEQUEUE(QQ) FIFO (first-in-first-out) キュー QQの先頭の位置を返す要素 xxをキュー QQの最後尾に入れる先頭の要素をキュー QQから除く エンキュー デキュー と読む ENQUEUE(a 2,Q) a 1 a 2 TOP(Q) a 1 a 2 DEQUEUE(Q) a 1 a 2 18

キューの実現法 TOP(Q) = 配列による実現 すべての操作の時間計算量は Θ(1) Q front j rear (j+i)%n 0 n-1 a i a 1 ENQUEUE(a i+1,q) front j rear (j+i+1)%n 0 n-1 Q a 1 a i a i+1 DEQUEUE(Q) front (j+1)%n rear (j+i+1)%n 0 n-1 a 1 a i a i+1 連結リストによる実現 TOP(Q) = a 1 front a i rear ENQUEUE(a i+1,s) すべての操作の時間計算量は Θ(1) front a 1 a i a i+1 DEQUEUE(Q) rear front a 1 a i a i+1 rear 19

配列によるキューの実現 配列で巡回リストを表すキューの長さ nn が限定された場合先頭と末尾がつながって, 輪になったリスト要素の位置を nn の剰余演算で決定 0 1 2 3 4 5 キュー Q: AA 4 AA 1 AA 2 AA 3 rear front 先頭から ii 番目の要素 = Q[(front+ ii ) mod nn] ( 例 ) front=3,nn=6 のとき,(0 から数えて )3 番目の要素は? Q[(front + 3) mod nn] = Q[6 mod 6] = Q[0] 20

今日のまとめ 基本的なデータ構造リスト : 最も基本的なデータ集合の表現 配列 / 連結リスト / 双連結リストによる実装 スタック : 積み上げ式のデータ格納方式キュー : 入れた順に取り出せるデータ格納方式 ポイント ポインタを用いたデータ構造 抽象データ型とその実装 21

付録 : データ構造とアルゴリズムの定番教科書 次の二冊のうち一冊は持っていると良い. 自習には本は必須. 茨木俊秀,Cによるアルゴリズムとデータ構造, 照晃堂,2916 円 平田富夫, アルゴリズムとデータ構造 改訂 C 言語版, 森北出版,2376 円. 以下の洋書は世界的にも有名な教科書. 日本語訳もある. Aho, Hopcroft, Ullman: The Design and Analysis of Computer Algorithms, Addison Wesley, 1974. 最初のデータ構造の教科書の一つ Knuth: The Art of Computer Programming, 1 巻 ( 基本算法 ),2 巻 ( 準数値算法 ),3 巻 ( 整列と探索 ), Addison-Wesley, 1975. 基本部分の百科辞典. 機械語で記述. 全部読んだ人は少ない? Cormen, Leiserson, Rivest, and Stein: Introduction to Algorithms, 3rd Edition, MIT Press, 2009. 現在, 最も定評がある教科書. 企業やプロコンなどでの勉強会の定番. 22