データ構造と
アルゴリズム
第四回
知能情報学部
新田直也
抽象データ型
データ構造とそれを操作するアルゴリズムを外から
見えないように一まとめに(カプセル化)したもの.
データ抽象とも呼ばれる(厳密には異なる概念).
メーラーソフトで考えてみよう.
受信する
メールを読む
メールを書く
アドレスを登録する
ユーザは操作の種類
(インタフェース)のみを
知っている.
操作の中身(アルゴリズム)や
データの保存形式(データ構造)
を知らなくても使える.
リスト
リスト: 抽象データ型の1つ(データの有限列)
5
7
3 11
リストのインターフェース
2
k番目の位置に要素を追加: insert(k, e)
k番目の位置の要素を削除: delete(k)
k番目の位置の要素を読む: read(k)
k番目の位置の要素に書く: write(k, e)
リストを実装可能なデータ構造は何通りもある.
配列,連結リスト,…
配列によるリストの実装(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)
続き…
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++;
}
}
連結リスト
各要素がリンクでつながっているリスト
先頭
5
2
7
3
11
n番目の要素には先頭からn回リンクをたどらなければた
どり着かない.
5
2
7
3
11
5
2
7
3
11
5
2
7
3
11
連結リストによるリストの実装
read, write: O(n)
insert: O(n)
先頭
5
2
3
11
7
3
7
delete: O(n)
先頭
5
2
11
リストの実装のまとめ
同じ抽象データ型でも内部のデータ構造が変わると操作す
るアルゴリズムもその計算量も変わる.
リストの場合:
リストの
配列による
インタフェース 実装
read
O(1)
連結リストによ
る実装
O(n)
write
O(1)
O(n)
insert
O(n)
O(n)
delete
O(n)
O(n)
連結リストのプログラム(1)
C言語での実装には構造体とポインタを用いる.
Javaではクラスとその参照だけで実装できる.
Webページを考えて見ればよい.
連結リストのプログラム(2)
struct CELL {
int value;
struct CELL *next;
}
CELL
value
next
内容
次ページのアドレス
(ポインタ)
1ページに相当
(構造体)
連結リストのプログラム(3)
ポインタの復習:
p がポインタ(アドレス)なら,*p は pが示す先を表す.
*p
p
構造体の復習:
s がメンバ m を持つ構造体なら,s.m は s のメンバ m を示す.
s
s.value
s.next
連結リストのプログラム(4)
先頭の要素を示すポインタ(リンク):
struct CELL *header;
ポインタを使ったアクセス:
*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 も同様.)
© Copyright 2026 ExpyDoc