データ構造とデータ記述

データとデータ構造

一般的なプログラミング言語においては、 言語備え付けのデータ構造をそのまま使うと、 スカラー、ベクトル(1次元配列)、行列(2次元配列) といった限られた構造しか扱えません。 言語仕様で与えられたものを組み合わせて、さまざまなデータ構造を記述します。 Java ではクラス、C言語では構造体という仕組みを用います。

Java のクラスでは、 セット(集合)、リスト、キュー、スタック、マップ、木といった代表的なデータ構造を表現することができます。 情報メディア学科では、 「データ構造とアルゴリズム」および「データ構造とアルゴリズム演習」という科目で学びます。

Java ではデータの 1要素を1オブジェクトとして扱い、 オブジェクト間の関係を参照(has-aの関係)で表すことにより、 複雑な構造を表現することがあります。 リスト、木、グラフなどの表現が可能です。 なお、グラフは行列でも表現することができます。

注: ここでいうグラフとは頂点と枝からなる構造のことです。Excel で作成するグラフのことではありません。

ファイル:6n-graf.svg

木は階層構造を持つさまざまなデータで利用されます。 HTML も階層構造を持つデータの一例です。

グラフはネットワーク構造を持つさまざまなデータで利用されます。 電気回路、インターネット、Webのリンク構造、SNSの人物関係などはネットワーク構造を持っています。

データ構造とデータ記述

データ構造というとプログラム内部でどうデータを扱うか、という観点に偏りがちですが、 プログラムとは独立に、データをどのように格納あるいは記述すればよいか、という議論もあります。

バイナリデータである画像や動画、音声の場合、 データ本体の格納のしかた、およびメタデータの付加のしかたについて規格化がされています。 JPEG, TIFF, PNG などの画像データ、MPEG, AVI などの動画データについて、 仕様を確認してみるとよいでしょう。

テキストで表現できるデータの場合にも、 ただの文章(plain text)である場合を除けば、なんらかの仕様に基づいて記述することになります。

ベクトル

ベクトル群を記述する最も基本的な仕様は、 CSV (Comma Separated Vector) でしょう。 1行1ベクトルで、要素間を「,」で区切る、それだけです。

a,b,c
d,e
f,g,h,i

もちろん、これではベクトルしか表現することができません。

属性と値

属性(attribute, key)と値(value)の組を表現する構造として、 属性と値を「:」で区切る、「=」で結ぶといった方法があります。 これは設定ファイルなどで広く使われています。

階層構造

階層構造を表現する最も簡便な方法は、ブラケット("["と"]") を使う記述でしょう。

abc
[a [b c]]

人間が話す言語(自然言語)も階層構造を持っています。

[白い[家の屋根]]
[[白い家]の[屋根]]

「黒い瞳の大きな女の子」を適切にブラケットを付与するとどうなるでしょうか。

SGML と XML

階層構造を記述する能力のある汎用的かつ強力な枠組みとして、 SGML (Standard Generalized Markup Language) があります。 この SGML は目的にあわせたデータ記述言語を作成するための一般的な仕組みであり、 HTML は Webページを記述する目的のために、SGML の規定に従って作成されました。

SGML は強力なのですが、 汎用的すぎて扱いが難しいという問題がありました。 Webで広く使うために、仕様を簡略化して生まれたのが XML です。

現在では、XML はデータ記述言語の決定版として、 Web に限らず広く利用されています。 また、さまざまな新たな技術が、XML の関連規格として策定されています。