6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)

Slides:



Advertisements
Similar presentations
3D Wand による 3 次 元形状計測. 3次元形状計測装置  3D Wand(テクノドリーム 21 社 製)  構成 3D Wand 本体: 7 つの発光ダイオー ドとラインレーザー発光装置が一体となっ た手に持って移動できる電池駆動の装置.
Advertisements

SPSSによるHosmer-Lemeshow検定について
あなたは真夜中に 山の頂上を目指す登山者です
1 7.時間限定チューリングマシンと クラス P. 2 7 -1.入力サイズ チューリングマシンの入力記号 の長さ を 入力サイズという。 名称:合成数の問題 インスタンス:整数n 問:nは合成数か? 通常は、入力サイズとしてはもっとも短い表現での 長さが利用される。 例えば、次のような合成数の問題における入力サイズは、
7.n次の行列式   一般的な(n次の)行列式の定義には、数学的な概念がいろいろ必要である。まずそれらを順に見ていく。
第 3 回 iPhone アプリ開発勉強会 Objective-C 基礎講座 - インスタンスメソッド - 三井 相和.
9.線形写像.
3.多項式計算アルゴリズム べき乗の計算 多項式の計算.
情報処理A 第10回 Excelの使い方 その3.
麻雀ゲーム 和島研究室 ソ 小林巧人
5.連立一次方程式.
相関.
1 情報量(2章). 2 物理的概念との対比1(入れ物と中 身) 塩水 塩 データ 情報 情報の量? 塩分の量! 情報の量は見た目ではわ からない。データと情報 は異なる概念。 塩分の量は見た目 ではわからない。 しかし、本質的な もの。
―本日の講義― ・平均と分散 -代表値 -ぱらつき(分散・標準偏差等) ・Excelによる演習
論理回路 第2回 今日の内容 前回の課題の説明 数の体系 – 数の表現 – 代表的な数 – 基数の変換 – 補数.
広告付き価格サービ ス 小園一正. はじめに 世の中には様々な表現方法の広告があり ます。その中でも私たち学生にとって身 近にあるものを広告媒体として取り入れ られている。 価格サービス(無料配布のルーズリー フ)を体験したことにより興味を惹かれ るきっかけとなった。主な目的は、これ.
素数判定法 2011/6/20.
1章 行列と行列式.
本宮市立白岩小学校. 1 はじめに 2 家庭学習プログラム開発の視点 ① 先行学習(予習)を生かした 確かな学力を形成する授業づく り ② 家庭との連携を図った家庭学習の習慣化.
プログラミングⅠ( 1 組) 第 9 回
フーリエ級数. 一般的な波はこのように表せる a,b をフーリエ級数とい う 比率:
プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功.
3.エントロピーの性質と各種情報量.
9.通信路符号化手法1 (誤り検出と誤り訂正の原理)
Excelによる積分.
1 6.低次の行列式とその応用. 2 行列式とは 行列式とは、正方行列の特徴を表す一つのスカ ラーである。すなわち、行列式は正方行列からスカ ラーに写す写像の一種とみなすこともできる。 正方行列 スカラー(実数) の行列に対する行列式を、 次の行列式という。 行列 の行列式を とも表す。 行列式と行列の記号.
計算のスピードアップ コンピュータでも、sin、cosの計算は大変です 足し算、引き算、掛け算、割り算は早いです
線形符号(10章).
1 0章 数学基礎. 2 ( 定義)集合 集合については、 3セメスタ開講の「離散数学」で詳しく扱う。 集合 大学では、高校より厳密に議論を行う。そのために、議論の 対象を明確にする必要がある。 ある “ もの ” (基本的な対象、概念)の集まりを、 集合という。 集合に含まれる “ もの ” を、集合の要素または元という。
10.PとNP完全問題との境界.
複素数.
4.プッシュダウンオートマトンと 文脈自由文法の等価性
1 0章 数学基礎. 2 ( 定義)集合 集合については、 3セメスタ開講の「離散数学」で詳しく扱う。 集合 大学では、高校より厳密に議論を行う。そのために、議論の 対象を明確にする必要がある。 ある “ もの ” (基本的な対象、概念)の集まりを、 集合という。 集合に含まれる “ もの ” を、集合の要素または元という。
信号測定. 正弦波 多くの場合正弦波は 0V の上下で振動する しかし、これでは AD 変換器に入れら れないので、オフ セットを調整して データを取った.
1 9.線形写像. 2 ここでは、行列の積によって、写像を 定義できることをみていく。 また、行列の積によって定義される写 像の性質を調べていく。
通信路(7章).
3.プッシュダウンオートマトンと 文脈自由文法
6.符号化法(6章).
ビット. 十進数と二進数 十進数  0から9までの数字を使って 0、1、2、3、4、5、6、7、8、9、 10、11、12 と数える 二進数  0と1を使って 0、1、10、11、100、101、11 0、111 と数える.
アルゴリズムとデータ構造 補足資料14-1 「ハッシュ法」
3.正方行列(単位行列、逆行列、対称行列、交代行列)
年度 情報数理学. 2 履修にあたって 2009 年度 大学院奇数セメスター(前期)開講 K336→ 大学院棟 D 416(次回から)教室: 時限: 火曜日3時限( 12:50 - 14:20 ) 担当 草苅良至 4/21( 火) 休講 → 補講 ?/? ? 時限 D416.
様々な情報源(4章).
プログラミング演習B ML編 第3回 2010/6/15 (コミ) 2010/6/16 (情報・知能) 住井 ~sumii/class/proenb2010/ml3/
論理回路 第1回. 今日の内容 論理回路とは? 本講義の位置づけ,達成目標 講義スケジュールと内容 受講時の注意事項 成績の評価方法.
伝わるスライド 中野研究室 M2 石川 雅 信. どのようなスライドを作れば良 いか 伝えたいこと.
方程式を「算木」で 解いてみよう! 愛媛大学 教育学部 平田 浩一.
C言語応用 構造体.
実装の流れと 今後のスケジュール 03k0014 岸原 大祐. システム概要 天気データをもとに、前向き推論をし ていき、親の代わりに子供に服装、持 ち物、気をつけることなどを教える。
DirectX を使った操作が簡単な2 D 格闘ゲームの制 作 ソ20003 蛯名敏規
3.多項式計算アルゴリズム べき乗の計算 多項式の計算.
Automatic Language Acquisition, an Interactive Approach † Robert J. Martin † 大西昇 ‡ 山村毅 † 名古屋大学 ‡ 愛知県立大学.
プログラミング演習B ML編 第3回 2006/7/4 (通信コース) 2006/7/12 (情報コース) 住井 ~sumii/class/proenb2006/ml3/
HKS Analysis Log Jul 2006 Part1 D.Kawama. 第壱部 HKS Sieve Slit Analysis.
HSPによる学習機能付き シューティングゲームの製作
1 プログラミング言語論 第13回 プログラムの意味論と検証 (2) 表示的意味論 担当:犬塚. 2 表示的意味論 denotational semantics  表示的意味論では、プログラムの要素とそれが 意味するものを対応付ける。 変数 式 文 A B … A+2 2B+C A:=A+2 if.
プログラミングⅠ( 2 組) 第 1 回 / pLB1.pptx.
8.任意のデータ構造 (グラフの表現とアルゴリズム)
プログラミング入門2 第3回 複合文、繰り返し 情報工学科 篠埜 功.
リファクタリング支援のための コードクローンに含まれる識別子の変更内容分析 井上研究室 工藤 良介 1.
第14回 プログラムの意味論と検証(3) 不動点意味論 担当:犬塚
実験5 規則波 C0XXXX 石黒 ○○ C0XXXX 杉浦 ○○ C0XXXX 大杉 ○○ C0XXXX 高柳 ○○ C0XXXX 岡田 ○○ C0XXXX 藤江 ○○ C0XXXX 尾形 ○○ C0XXXX 足立 ○○
1 アルゴリズムの高速化. 2 アルゴリズムにおける 大幅な性能アップ 多項式時間アルゴリズム VS 対数時間アルゴリズム (最大公約数の問題) 指数時間アルゴリズム VS 多項式時間アルゴリズム (フィボナッチ数列を求める問題)
音の変化を視覚化する サウンドプレイヤーの作成
プログラミングの基礎知識 プログラミングの手順と重要概念 アルゴリズム. プログラミングの手順 コーディング エディタなどでコードを記述 コンパイル・インタープリタ 実行可能な形に翻訳 デバッグ(虫取り、不具合の調整) 完成!
Self-efficacy(自己効力感)について
本文. 考えながら読みましょ う 「いろいろなこと」( 3 行目)は何で すか 「①電話料金はコンビニで支払いをしていま す。いつでも払えますから、便利です。」 「②夕食はコンビニで買います。お弁当やお かずがいろいろありますから。」今、若者に 人気のあるコンビニは、いろいろなことをす るのに非常に便利な場所になった。
今日の内容 高階関数  関数を値として扱う 関数を引数にとる 関数を返す関数 プログラミングの例題  クイックソート.
英語勉強会 名手⇒詫間 2015/10/22. 原文 This study says acquiring motor skills support system. There is how to acquire moor skills that coach advises learner. Motor.
地球儀と様々な地図. 1 球体としての地球 こうした現象はあることをイ メージすると理解できる。
Presentation transcript:

6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue) 6-4.デク(Double-Ended-Queue) 6-5.抽象データ型(Abstract Data Type)

データ構造とは、 データの保存を効率的に行うもの。 ito 1 2.712 3.14 suzuki データ構造

6-1.連結リスト(Linked List) 配列が不得意とする問題 多量のデータをあつかうためのデータ構造として、  多量のデータをあつかうためのデータ構造として、 配列がある。しかし、配列では扱いにくい問題もある。 例えば、整列してあるデータに、新しいデータを挿入して、また整列の状態にする問題を考えよう。 2 5 6 8 配列A A[0] A[1] A[i] A[M-1] A[j]

整列されている配列へのデータ挿入。 2 5 6 8 10 配列A A[0] A[1] A[i] A[M-1] A[j] INSERT(A,3) 2 5 6 8 10 配列A A[0] A[1] A[i] A[M-1] A[j] 3 2 5 6 8 10 配列A A[0] A[1] A[i] A[M-1] A[j] このような問題では、配列操作に余分な手間が必要。

柔軟なデータ構造の構築にむけて アィディア 構造体とポインタを組み合わせる。 必要な分だけのメモリを確保する。(配列では、プログラムの開始時点で余分なメモリが確保されていた。) 自己再帰的な定義を用いる。

データ構造の基本単位(セル) 自己参照構造体を用いる。 strcut cell { double data; struct cell * next; };  struct cellという構造体を定義するのに、 struct cellを指すポインタをもちいている。

イメージ NULL 3.14 0xb00ff 一見すると、奇異な感じをうける定義であるが、  一見すると、奇異な感じをうける定義であるが、 ポインタがアドレスを保持する変数ということに注意すると理解しやすい。 NULL 3.14 0xb00ff data next strcut cell型 このことを、次のような図を用いて表すこともある。 終わりを 意味する。 strcut cell型

セル型の定義 typedef strcuct cell Cell; data next Cell型 ポインタでは、保持しているアドレスの先がデータ型であることに注意する。 Cell * 型

セルの動的なメモリ確保 Cell * new;/*新しいセル*/ new = (Cell * ) malloc (sizeof (Cell)); 引数の型のサイズを求める。 キャストする。 メモリを確保する。 (void *を返す。) 一般のポインタ を表す型。

Cell * new;/*新しいセル*/ new new = (Cell * ) malloc (sizeof (Cell)); new data next

C言語における略記法 new data next ポインタ(変数) (*new).data; これらは、構造体メンバ名であって、変数名ではないことに注意する。 new->data; C言語では、上の2つは同じ意味で用いられる。 下の表記法は、ポインタの図式と類似点がある。 data next new

連結リスト 3.14 2.71 NULL 1.41 セルをポインタで一直線上にならべたもの。 head 1.41 2.71 3.14 連結リストの途中は、直接参照(アクセス)できない。 (変数による“名前”がついていない。)

連結リストへの挿入 1.41 head 2.71 3.14 2.23 1.41 2.71 3.14 head 2.23 1.41 3.14 2.71 head 2.23

実現例 /*位置posの後に新しいセルを挿入*/ void insert(Cell * pos,double x) { Cell *new=(Cell *)malloc(sizeof(Cell)); new->data=x; new->next=pos->next; pos->next=new; retun; }; ポインタにはアドレスが保持してあることに注意して更新の順序を考えること。

連結リストへの挿入の計算量 定数回の代入演算を行っているだけであるので、1回あたりの時間計算量は、 時間 である。            時間  である。 (nデータが整列してある配列に、整列を保ったまま挿入する時間計算量は、1回あたり、  であることに注意する。)

連結リストからのデータ削除 1.41 2.71 3.14 head 2.23 1.41 2.71 3.14 head 2.23

実現例 /*位置posの後のセルを削除(概略)*/ void delete(Cell * pos) { Cell *old; old=pos->next; pos->next=old->next; free(old); retun; }; メモリの解放

連結リストへの削除の計算量 定数回の代入演算を行っているだけであるので、1回あたりの時間計算量は、 時間 である。            時間  である。 (nデータが整列してある配列に、整列を保ったまま削除する時間計算量は、1回あたり、  であることに注意する。)

連結リストと配列1 (データ構造の準備) NULL 連結リストは、 宣言時には、先頭の ポインタだけが必要。 head 配列は、宣言時にメモリが 確保される。 配列A A[0] A[1] A[i] A[M-1] A[j]

実現例 /*リストの用意*/ Cell * make_list(void) { Cell * head=NULL; return head; } /*配列の用意*/ double * make_array(void) { doube A[100]; return A; }

連結リストと配列2 (要素へのアクセス) 2.71 3.14 NULL 1.41 head 途中のセルには、 名前がついていない。 A[i]として途中のセルにも アクセスできる。 配列A A[0] A[1] A[i] A[M-1] A[j]

実現例 /*リスト3番目のデータを返す。(概略)*/ double retrun_second_list(Cell * head) { doulbe tmp; tmp=head->next->next->data; return tmp; } /*配列の3番目のデータを返す。*/ double return_second_array(double *A) { return A[2]; }

練習 連結リストおよび、配列において、 4番目の要素を返すC言語の関数の概略を示せ。 さらに、連結リストおよび、配列において、 k番目の要素を返すC言語の関数の概略を示せ。

連結リストのk番目の要素参照に必要な計算量 定数回の代入演算を行っているだけであるので、1回あたりの時間計算量は、            時間  である。 (nデータがの配列のk番目を参照するには、1回あたり、  であることに注意する。)

連結リストと配列(まとめ) 連結リスト 配列 挿入 削除   番目の参照 :データ数

6-2.スタック(Stack) 後入れ先出し(Last In First Out,LIFO)の効果を持つデータ構造。 先頭においてしかデータの挿入、削除を行わない連結リスト

スタックのイメージ data4 data0 void push(double) doulbe pop() data3 data2 data1

例題 空のスタックに対して、次の系列で演算を行った場合, 取り出されるデータの順序および、 最後のスタックの状態を示せ。 push(10),push(5),pop(),push(15),push(20), pop(),pop(),push(30),pop() 20 15 5 15 10 10 10 10 10 15 30 10 10 10 10

練習 空のスタックに対して、次の系列で演算を行った場合, 取り出されるデータの順序および、 最後のスタックの状態を示せ。 push(5),pop(),push(7),push(3),pop(),push(8), ,push(1),pop(),pop(),push(9),pop(),pop()

連結リストによるスタック 10 NULL 20 15 先頭だけで、データの挿入削除を行う。 途中の接続関係は維持したままにする。 head

push(x) 20 15 10 head 30 20 15 10 head 30 20 15 10 head 30

実現例 /*スタックへのpush(x)*/ void push(Cell * head,double x) { Cell *new=(Cell *)malloc(sizeof(Cell)); new->data=x; new->next=head; head=new; retun; }; ポインタにはアドレスが保持してあることに注意して更新の順序を考えること。

pop() 20 15 10 head 20 15 10 head old 15 10 head 20 old

実現例 /*スタックからのpop()概略*/ double pop(Cell * head) { Cell *old; doulbe x; if(head==NULL)return -1;/*アンダーフロー*/ old=head; head=head->next; x=old->data; free(old); retun x; };

配列によるスタック 配列でもスタックを実現することができる。 A[0] A[n-1] A[1] A[0] A[n-1] A[1] A[0] push(x) push(x) pop() 1 top -1 top top top

実現例 /*配列でのスタック(概略)*/ int Top; doulbe Stack[100]; void push(double x){ if(Top>=100)return;/*オーバーフロー*/ Stack[Top]=x; retun; }; doulbe pop(void){ double x; if(Top<0)return -1;/*アンダーフロー*/ x=Stack[Top]; Top--; return x; }

スタック操作の計算量 連結リスト 配列 push (先頭への要素挿入) Pop (先頭要素の削除と取得) :データ数

6-3.キュー(Queue) 先入れ先出し(First In First Out,FIFO)の効果を持つデータ構造。 先頭と末尾を管理する。 データの挿入を末尾から行い、データの削除を先頭から行う連結リスト

キューのイメージ data4 void enqueue(double) 末尾 data3 data2 data1 先頭 data0 double dequeue() data0

例題 空のキューに対して、次の系列で演算を行った場合, 取り出されるデータの順序および、 最後のスタックの状態を示せ。 enqueue(10),enqueue(5),degueue(),enqueue(15), enqueue(20),dequeue(),dequeue(),enqueue(30), dequeqe() 20 15 5 5 15 10 10 5 5 20 30 20 30 15 20

練習 空のキューに対して、次の系列で演算を行った場合, 取り出されるデータの順序および、 最後のキューの状態を示せ。 enqueue(5),dequeue(),enqueue(7),enqueue(3), dequeue(),enqueue(8),enqueue(1),dequeue(), dequeue(),enqueue(9),dequeue(),dequeue()

連結リストによるキュー 20 NULL 5 15 末尾からデータの挿入し、 先頭からデータを削除を行う。 途中の接続関係は維持したままにする。 20 NULL 5 15 head tail 5 15 20 head tail

enqueue(x) 5 15 20 head 30 tail 5 15 20 head 30 tail 5 15 20 head 30

実現例 /*キューへのenqueue(x)*/ void enqueue(Cell * head,Cell *tail,double x) { Cell *new=(Cell *)malloc(sizeof(Cell)); new->data=x; new->next=NULL; tail->next=new; tail=new; retun; }; ポインタにはアドレスが保持してあることに注意して更新の順序を考えること。

dequeue() 5 15 20 head tail 5 15 20 head tail old head 15 20 5 tail

実現例 /*キューからのdequeue()概略*/ double dequeue(Cell * head,Cell *tail) { Cell *old; doulbe x; if(head==NULL)return -1;/*アンダーフロー*/ old=head; head=head->next; x=old->data; free(old); retun x; };

配列によるキュー(リングバッファ) 配列でもキューを実現することができる。 -1 A[0] tail -1 A[n-1] A[1] head enqueue(x) 1 tail tail 1 head -1 tail head -1 head enqueue(x) dequeue()

実現例 /*配列でのキュー(概略)*/ int Head; int Tail; doulbe Queue[100]; void enqueue(double x){ Tail=(Tail+1)%100;/*添え字の循環*/ if(Tail==Head)return;/*オーバーフロー*/ Queue[Tail]=x; retun; }; doulbe dequeue(void){ double x; if(Head==Tail)return -1;/*アンダーフロー*/ Head=(Head+1)%100;/*添え字の循環*/ x=Stack[Head]; return x; }

キュー操作の計算量 連結リスト 配列 enqueue (末尾への要素挿入) dequeue (先頭要素の削除と取得) :データ数

6-4.デク (Double Ended Queue) 先頭と末尾の両方からデータを出し入れできるデータ構造 先頭と末尾を管理。 スタックとキューの性能を合わせ持つ。 双方向リストを持ちいて実現される。

デクのイメージ data a data b head_in(double) doulbe head_out() data3 data2 doulbe tail_out() tail_in(double) data c data d

デクの実現のためには 連結リストを拡張し、双方向リストにする必要がある。 セルを拡張する。

双方向リストのセル strcut d_cell { double data; struct d_cell * prev; struct d_cell * next; }; 前方を指すポインタと、後方を指すポインタとして実現。

イメージ 0xb00ff 0xb00aa 3.14 NULL NULL prev data next strcut d_cell型 このことを、次のような図を用いて表すこともある。 3.14 strcut d_cell型

双方向リストのセル型の定義 typedef strcuct d_cell D_cell; prev data next D_cell型

双方向リストによるデク

練習 デクにおける挿入および削除の様子を図示せよ。 また、挿入を表す関数を作成せよ。 5 3 8 head tail 操作例:head_in(6)→tail_in(2)→head_out()→tail_out()

デク操作の計算量 連結リスト 配列 head_in (先頭へ要素挿入) head_out (先頭要素の削除と取得) tail_in (末尾へ要素挿入) tail_out (末尾要素の削除と取得)

6-5.抽象データ型 (Abstract Data Type) 6-5.抽象データ型 (Abstract Data Type) 同じ操作法と、同じ効果を持つデータ構造を抽象データ型という。 例えば、スタックやキューは抽象データ型。 (個々の実装は、連結リストや配列で行われる。しかし、重要なのは、その操作法と効果である。)

抽象データ型としてのスタック スタック 操作 効果 /*データの挿入*/ void push(x);/ /*データの取り出し*/ double pop(void); LIFO (後入れ先だし) つまり、 x=pop()を行って push(x)を行えばもとの状態にもどる。

イメージ 5 3 5 3 8 8 抽象データ型としてのスタック データ構造では、操作法とその効果だけが重要 20 15 10 NULL

抽象データ型としてのキュー キュー 操作 効果 /*データの挿入*/ void enqueue(x);/ /*データの取り出し*/ double dequeue(void); FIFO (先入れ先だし) つまり、 dequeueで取り出される順番は、 各要素がenqueueされた順番とひとしい。

イメージ 8 3 5 3 8 5 抽象データ型としてのキュー 20 15 10 NULL

抽象データ型の利用 /*プロトタイプ宣言*/ /*連結リストによるスタック*/ void push( double); double pop(); main() { push(4); push(5);   x=pop(); y=pop(); } /*プロトタイプ宣言*/ /*配列によるスタック*/ void push( double); double pop(); main() { push(4); push(5);   x=pop(); y=pop(); } 全く同一。