Microsoft PowerPoint - 6.pptx

Similar documents
Microsoft PowerPoint - 06.pptx

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

第2回

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

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

PowerPoint プレゼンテーション

memo

PowerPoint プレゼンテーション

alg2015-3r3.ppt

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

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

Microsoft PowerPoint - kougi9.ppt

プログラミングI第10回

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

memo

PowerPoint プレゼンテーション

第3回 配列とリスト

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

Microsoft PowerPoint - lec10.ppt

Microsoft PowerPoint - 05.pptx

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

PowerPoint Template

Microsoft PowerPoint - 11.pptx

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

CプログラミングI

プログラム言語及び演習Ⅲ

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

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

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

計算機ソフトウエア

Microsoft Word - no12.doc

PowerPoint Presentation

Microsoft Word - no205.docx

Microsoft Word - no206.docx

memo

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

02: 変数と標準入出力

02: 変数と標準入出力

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

gengo1-11

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

Microsoft Word - Cプログラミング演習(11)

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

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

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

DA02

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

Microsoft PowerPoint - prog13.ppt

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

Microsoft PowerPoint pptx

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

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

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

PowerPoint Presentation

Microsoft PowerPoint - 計算機言語 第7回.ppt

PowerPoint プレゼンテーション

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

memo

プログラミング基礎

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Prog1_10th

r07.dvi

memo

第12回:木構造

ohp07.dvi

プログラミング基礎

第3回 配列とリスト

Microsoft Word - 13

Microsoft PowerPoint - Pro110111

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

Prog1_6th

基礎プログラミング2015

memo

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

Microsoft PowerPoint - H22プログラミング第一(E)#12

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

情報処理Ⅰ演習

Microsoft PowerPoint - PLT3.ppt

program7app.ppt

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

JavaプログラミングⅠ

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint ppt

第2回

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

演算増幅器

Prog1_15th

Microsoft Word - no202.docx

O(N) ( ) log 2 N

PowerPoint プレゼンテーション

02: 変数と標準入出力

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

Microsoft PowerPoint - 7.pptx

PowerPoint プレゼンテーション

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint - kougi10.ppt

Microsoft Word - no15.docx

Transcription:

6. データ構造入門 6-1. 連結リスト (Linked List) 6-2. スタック (Stack) 6-. キュー (Queue) 6-4. デク (Double-Ended-Queue) 6-. 抽象データ型 (Abstract Data Type) データ構造とは データの保存を効率的に行うもの 1 ito 2.712.14 suzuki データ構造 1 2 6-1. 連結リスト (Linked List) 配列が不得意とする問題 多量のデータをあつかうためのデータ構造として 配列がある しかし 配列では扱いにくい問題もある 例えば 整列してあるデータに 新しいデータを挿入して また整列の状態にする問題を考えよう 整列されている配列へのデータ挿入 2 6 10 配列 A A[0]A[1] A[i] A[j] A[M-1] INSERT(A,) 2 6 10 配列 A A[0]A[1] A[i] A[j] A[M-1] 2 6 配列 A A[0]A[1] A[i] A[j] A[M-1] 2 6 10 配列 A A[0]A[1] A[i] A[j] A[M-1] このような問題では 配列操作に余分な手間が必要 4 柔軟なデータ構造の構築にむけて アィディア 構造体とポインタを組み合わせる 必要な分だけのメモリを確保する ( 配列では プログラムの開始時点で余分なメモリが確保されていた ) 自己再帰的な定義を用いる データ構造の基本単位 ( セル ) 自己参照構造体を用いる strcut cell double data; struct cell * next; struct cell という構造体を定義するのに struct cell を指すポインタをもちいている 6 1

イメージ一見すると 奇異な感じをうける定義であるが ポインタがアドレスを保持する変数ということに注意すると理解しやすい typedef strcuct cell セル型の定義 Cell; data next strcut cell 型このことを 次のような図を用いて表すこともある data next Cell 型 strcut cell 型 終わりを意味する 7 Cell * 型 ポインタでは 保持しているアドレスの先がデータ型であることに注意する セルの動的なメモリ確保 Cell * new;/* 新しいセル */ new = (Cell * ) malloc (sizeof (Cell)); new Cell * new;/* 新しいセル */ new = (Cell * ) malloc (sizeof (Cell)); キャストする メモリを確保する (void * を返す ) 一般のポインタを表す型 引数の型のサイズを求める 9 new data next 10 C 言語における略記法 連結リスト new data next セルをポインタで一直線上にならべたもの ポインタ ( 変数 ) (*new).data ; new->data; これらは 構造体メンバ名であって 変数名ではないことに注意する C 言語では 上の 2 つは同じ意味で用いられる 下の表記法は ポインタの図式と類似点がある new data next 11 1.41 2.71.14 連結リストの途中は 直接参照 ( アクセス ) できない ( 変数による 名前 がついていない ) 12 2

連結リストへの挿入 1.41 2.71.14 2.2 1.41 2.71.14 2.2 /* 位置 posの後に新しいセルを挿入 */ void insert(cell * pos,double x) Cell *new=(cell *)malloc(sizeof(cell)); new->data=x; new->next=pos->next; t pos->next=new; 1.41 2.2 2.71.14 1 ポインタにはアドレスが保持してあることに注意して更新の順序を考えること 14 連結リストへの挿入の計算量 定数回の代入演算を行っているだけであるので 1 回あたりの時間計算量は () 時間である (nデータが整列してある配列に 整列を保ったまま挿入する時間計算量は 1 回あたり On ( ) 時間であることに注意する ) 1 連結リストからのデータ削除 1.41 2.71.14 2.2 1.41 2.71.14 2.2 16 /* 位置 posの後のセルを削除 ( 概略 )*/ void delete(cell * pos) Cell *old; old=pos->next; pos->next=old->next; t free(old); メモリの解放 17 連結リストへの削除の計算量 定数回の代入演算を行っているだけであるので 1 回あたりの時間計算量は () 時間である (nデータが整列してある配列に 整列を保ったまま削除する時間計算量は 1 回あたり On ( ) 時間であることに注意する ) 1

連結リストと配列 1 ( データ構造の準備 ) 連結リストは 宣言時には 先頭のポインタだけが必要 /* リストの用意 */ Cell * make_list(void) Cell * =NULL; return ; 配列 A A[0]A[1] 配列は 宣言時にメモリが確保される A[i] A[j] A[M-1] 19 /* 配列の用意 */ double * make_array(void) doube A[100]; return A; 連結リストと配列 2 ( 要素へのアクセス ) 途中のセルには 名前がついていない /* リスト 番目のデータを返す ( 概略 )*/ double retrun_second_list(cell * ) doulbe tmp; tmp=->next->next->data; return tmp; 配列 A A[0]A[1] A[i] として途中のセルにもアクセスできる A[i] A[j] A[M-1] 21 /* 配列の 番目のデータを返す */ double return_second_array(double *A) return A[2]; 22 練習 連結リストおよび 配列において 4 番目の要素を返す C 言語の関数の概略を示せ さらに 連結リストおよび 配列において k 番目の要素を返すC 言語の関数の概略を示せ 連結リストの k 番目の要素参照に必要な計算量 定数回の代入演算を行っているだけであるので 1 回あたりの時間計算量は Ok () 時間である (nデータがの配列のk 番目を参照するには 1 回あたり 時間であることに注意する ) 2 24 4

挿入 削除 k 連結リストと配列 ( まとめ ) 番目の参照 連結リスト 配列 O (1) On ( ) Ok () On ( ) 6-2. スタック (Stack) 後入れ先出し (Last In First Out,LIFO) の効果を持つデータ構造 先頭においてしかデータの挿入タの挿入 削除を行わない連結リスト n : データ数 2 26 スタックのイメージ data4 data0 void push(double) doulbe pop() data data2 data1 例題 空のスタックに対して 次の系列で演算を行った場合, 取り出されるデータの順序および 最後のスタックの状態を示せ push(10),push(),pop(),push(1),push(), pop(),pop(),push(),pop() p() p p() p ( ) p p() 10 10 1 1 10 10 10 27 1 10 10 10 10 1 2 練習 空のスタックに対して 次の系列で演算を行った場合, 取り出されるデータの順序および 最後のスタックの状態を示せ push(),pop(),push(7),push(),pop(),push(),,push(1),pop(),pop(),push(9),pop(),pop() 連結リストによるスタック 先頭だけで データの挿入削除を行う 途中の接続関係は維持したままにする 1 10 29

push(x) 1 10 1 10 /* スタックへのpush(x)*/ void push(cell *,double x) Cell *new=(cell *)malloc(sizeof(cell)); new->data=x; new->next=; =new; 1 10 1 ポインタにはアドレスが保持してあることに注意して更新の順序を考えること 2 pop() 1 10 1 10 old 1 10 old /* スタックからのpop() 概略 */ double pop(cell * ) Cell *old; doulbe x; if(==null)return -1;/* 1/* アンダーフロー */ old=; =->next; x=old->data; free(old); retun x; 4 配列によるスタック 配列でもスタックを実現することができる A[n-1] A[n-1] A[n-1] push(x) push(x) pop() A[n-1] /* 配列でのスタック ( 概略 )*/ int Top; doulbe Stack[100]; void push(double x) Top++; if(top>=100)return;/* オーバーフロー */ Stack[Top]=x; -1 top A[1] A[0] 0 top A[1] A[0] 1 top A[1] A[0] 0 top A[1] A[0] doulbe pop(void) double x; if(top<0)return -1;/* アンダーフロー */ x=stack[top]; Top--; return x; 6 6

スタック操作の計算量 push ( 先頭への要素挿入 ) Pop ( 先頭要素の削除と取得 ) 連結リスト 配列 O (1) 6-. キュー (Queue) 先入れ先出し (First In First Out,FIFO) の効果を持つデータ構造 先頭と末尾を管理する データの挿入を末尾から行い データの削除を先頭から行う連結リスト n : データ数 7 キューのイメージ data4 void enqueue(double) 末尾 data data2 data1 先頭 double dequeue() data0 9 例題空のキューに対して 次の系列で演算を行った場合, 取り出されるデータの順序および 最後のスタックの状態を示せ enqueue(10),enqueue(),degueue(),enqueue(1), enqueue(),dequeue(),dequeue(),enqueue(), dequeqe() 1 10 10 10 1 1 1 40 練習 空のキューに対して 次の系列で演算を行った場合, 取り出されるデータの順序および 最後のキューの状態を示せ 連結リストによるキュー 末尾からデータの挿入し 先頭からデータを削除を行う 途中の接続関係は維持したままにする enqueue(),dequeue(),enqueue(7),enqueue(), dequeue(),enqueue(),enqueue(1),dequeue(), dequeue(),enqueue(9),dequeue(),dequeue() 1 41 42 7

enqueue(x) 1 1 1 4 /* キューへのenqueue(x)*/ void enqueue(cell *,Cell *,double x) Cell *new=(cell *)malloc(sizeof(cell)); new->data=x; new->next=null; ->next=new; =new; ポインタにはアドレスが保持してあることに注意して更新の順序を考えること 44 dequeue() 1 1 old 1 old 4 /* キューからのdequeue() 概略 */ double dequeue(cell *,Cell *) Cell *old; doulbe x; if(==null)return -1;/* 1/* アンダーフロー */ old=; =->next; x=old->data; free(old); retun x; 46 0-1 配列によるキュー ( リングバッファ ) 配列でもキューを実現することができる -1-1 A[n-1] A[0] A[1] enqueue(x) 1-1 enqueue(x) dequeue() 1 0 47 /* 配列でのキュー ( 概略 )*/ int Head; int Tail; doulbe Queue[100]; void enqueue(double x) Tail=(Tail+1)%100;/* 添え字の循環 */ if(tail==head)return;/* オーバーフロー */ Queue[Tail]=x; doulbe dequeue(void) double x; if(head==tail)return -1;/* アンダーフロー */ Head=(Head+1)%100;/* 添え字の循環 */ x=stack[head]; return x; 4

キュー操作の計算量 enqueue ( 末尾への要素挿入 ) dequeue ( 先頭要素の削除と取得 ) 連結リスト 配列 O (1) 6-4. デク (Double Ended Queue) 先頭と末尾の両方からデータを出し入れできるデータ構造 先頭と末尾を管理 スタックとキューの性能を合わせ持つ 双方向リストを持ちいて実現される n : データ数 49 0 デクのイメージ デクの実現のためには data a _in(double) data data b doulbe _out() 連結リストを拡張し 双方向リストにする必要がある セルを拡張する data2 data1 _in(double) doulbe _out() data c data d 1 2 双方向リストのセル イメージ strcut d_cell double data; struct d_cell * prev; struct d_cell * next; prev data next strcut d_cell 型このことを 次のような図を用いて表すこともある.14 前方を指すポインタと 後方を指すポインタとして実現 strcut d_cell 型 4 9

双方向リストのセル型の定義 typedef strcuct d_cell D_cell; 双方向リストによるデク prev data next D_cell 型 prev data next D_cell * 型 6 練習 デクにおける挿入および削除の様子を図示せよ また 挿入を表す関数を作成せよ デク操作の計算量連結リスト _in ( 先頭へ要素挿入 ) 配列 _out ( 先頭要素の削除と取得 ) () 操作例 :_in(6) _in(2) _out() _out() 7 _in ( 末尾へ要素挿入 ) _out ( 末尾要素の削除と取得 ) O (1) O (1) 6-. 抽象データ型 (Abstract Data Type) 同じ操作法と 同じ効果を持つデータ構造を抽象データ型という 例えば スタックやキューは抽象データ型 タ型 ( 個々の実装は 連結リストや配列で行われる しかし 重要なのは その操作法と効果である ) 抽象データ型としてのスタック 操作 /* データの挿入 */ void push(x);/ スタック /* データの取り出し */ double pop(void); 効果 LIFO ( 後入れ先だし ) つまり x=pop() を行って push(x) を行えばもとの状態にもどる 9 60 10

イメージ 抽象データ型としてのキュー 操作 キュー 効果 抽象データ型としてのスタックデータ構造では 操作法とその効果だけが重要 /* データの挿入 */ void enqueue(x);/ /* データの取り出し */ double dequeue(void); FIFO ( 先入れ先だし ) つまり dequeueで取り出される順番は 各要素が enqueueされた順番とひとしい 61 62 イメージ 抽象データ型としてのキュー /* プロトタイプ宣言 */ /* 連結リストによるスタック */ void push( double); double pop(); main() push(4); push(); x=pop(); y=pop(); 抽象データ型の利用 /* プロトタイプ宣言 */ /* 配列によるスタック */ void push( double); double pop(); main() push(4); push(); x=pop(); y=pop(); 全く同一 6 64 11