データ構造と アルゴリズム 第四回 知能情報学部 新田直也.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
5.データ構造入門 5-1.連結リスト(Linked List) 5-2.スタック(Stack) 5-3.キュー(Queue)
データ構造とアルゴリズム 第10回 mallocとfree
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 第3回基本的なデータ構造(リスト) 2015/10/28 アルゴリズムとデータ構造 2015.
アルゴリズムとデータ構造 2011年6月13日
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
INSERT(x,p,L)の例 (一部) 磯 直行 2009年5月5日
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
最短経路.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
~手続き指向からオブジェクト指向へ[Ⅱ]~
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
プログラミング 3 構造体(2).
アルゴリズムとデータ構造勉強会 第6回 スレッド木
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
先進的計算基盤システムシンポジウム SACSIS2007併設企画 マルチコアプログラミングコンテスト 「Cellスピードチャレンジ2007」
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング 4 木構造とヒープ.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
6.データ構造入門 6-1.連結リスト(Linked List) 6-2.スタック(Stack) 6-3.キュー(Queue)
データ構造とアルゴリズム 第11回 リスト構造(1)
プログラミング 3 2 次元配列.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月11日
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング論 構造体
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
参考:大きい要素の処理.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズムI 第三回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
C言語講座第5回 2017 構造体.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

データ構造と アルゴリズム 第四回 知能情報学部 新田直也

抽象データ型 集合抽象データ型 抽象データ型では, ≪操作≫ ≪データ構造≫ 要素の追加 要素の削除 要素の有無 要素の数を調べる 操作の種類と働きは定義されているが,操作のアルゴリズムは問われない.(正しければ何でもよい.) 具体的なデータ構造も定義されていない. →情報隠蔽と呼ばれる. 集合抽象データ型 ≪操作≫ ≪データ構造≫ 要素の追加 要素の削除 要素の有無 要素の数を調べる 2 11 5 3 7

リスト リスト: 抽象データ型の1つ(データの有限列) リストのインターフェース リストを実装可能なデータ構造は何通りもある. k番目の位置に要素を追加: insert(k, e) k番目の位置の要素を削除: delete(k) k番目の位置の要素を読む: read(k) k番目の位置の要素に書く: write(k, e) リストを実装可能なデータ構造は何通りもある. 配列,連結リスト,… 5 2 7 3 11

配列によるリストのイメージ 運動場に一列に並べた段ボール箱を考える. 段ボール箱の中には番号が書かれたボーリングの玉が端から詰められている. 5 2 7 3 11

配列によるリストの実装(1) まずは簡単なものから… int list[1000]; int num = 0; int read(int k) { if (k < num) return list[k]; return ERR; } void write(int k, int e) { if (k < num) list[k] = e;

配列によるリストの実装(2) 続き… deleteは…? void insert(int k, int e) { if (k <= num) { for (int n = num - 1; n >= k; n--) { list[n+1] = list[n]; } list[k] = e; num++; deleteは…?

リストを配列で実装した場合の計算量 データのサイズ: 配列の要素数(num). (最悪)時間計算量 read: 2ステップ → O(1) write: 2ステップ → O(1) insert: k が 0 の場合最悪. (2×num + 3)ステップ → O(num) void insert(int k, int e) { if (k <= num) { for (int n = num - 1; n >= k; n--) { list[n+1] = list[n]; } list[k] = e; num++;

連結リスト 各要素がリンクでつながっているリスト n番目の要素には先頭からn回リンクをたどらなければたどり着かない. 先頭 5 2 7 3 11 5 2 7 3 11 5 2 7 3 11 5 2 7 3 11

連結リストのイメージ 運動場にバラバラに配置した段ボール箱を考える. 段ボール箱はリストの並び順に紐で結ばれている. 3 11 5 7 2

連結リストによるリストの実装 read, write: O(n) insert: O(n) delete: O(n) 先頭 5 2 3 11 7 先頭 5 2 7 3 11

リストの実装のまとめ 同じ抽象データ型でも内部のデータ構造が変わると操作するアルゴリズムもその計算量も変わる. リストの インタフェース リストの場合: リストの インタフェース 配列による 実装 連結リストによる実装 read O(1) O(n) write insert delete

連結リストのプログラム(1) C言語での実装には構造体とポインタを用いる. Webページを考えて見ればよい. Javaではクラスとその参照だけで実装できる. Webページを考えて見ればよい.

連結リストのプログラム(2) struct CELL { int value; struct CELL *next; } 内容 1ページに相当 (構造体) 次ページのアドレス (ポインタ) CELL value next

連結リストのプログラム(3) ポインタの復習: 構造体の復習: p がポインタ(アドレス)なら,*p は pが示す先を表す. *p s がメンバ m を持つ構造体なら,s.m は s のメンバ m を示す. *p p s s.value s.next

連結リストのプログラム(4) 先頭の要素を示すポインタ(リンク): ポインタを使ったアクセス: struct CELL *header; *(*header).next header (*header).value (*header).next (*(*header).next).value (*(*header).next).next

連結リストのプログラム(5) リストの最後は? リストを順に表示するプログラム: 略記法: next が何も指さない(NULL). struct CELL *header; for (p = header; p != NULL; p = (*p).next ) { printf(“%d\n”, (*p).value); } 略記法: (*p).next は p->next と書ける. ( (*p).value も同様.)