コンテンツにスキップ

データ構造

はじめに

本サイトにつきまして、【IT技術の知見】はじめに - 俺の技術ノート をご認識のほど宜しくお願いいたします。


01. データ構造の実装方法

ハードウェアが処理を行うときに、データの集合を効率的に扱うためのデータ格納形式をデータ構造という。

データ構造の実装方法を以下に示す。

配列型

同じデータ型のデータを並べたデータ格納様式のこと。

▼ インデックス配列

番号キーごとに値が格納された配列型のこと。

Go の場合の実装例
array := []string{"A", "B", "C"}

fmt.Println(array)

// [A B C]
TypeScript の場合の実装例
const array: string[] = ["A", "B", "C"];

console.log(array);

// [ 'A', 'B', 'C' ]
PHP の場合の実装例
<?php

$array = ["A", "B", "C"];

print_r($array);

// Array
// (
//     [0] => A
//     [1] => B
//     [2] => C
// )

▼ 多次元配列

配列のなかに配列を持つ配列型のこと。

配列の入れ子構造が2段の場合、『2 次元配列』と呼ぶ。

Go の場合の実装例
array := [][]string{
    {"リンゴ", "イチゴ", "トマト"},
    {"メロン", "キュウリ", "ピーマン"},
}

fmt.Println(array)

// [[リンゴ イチゴ トマト] [メロン キュウリ ピーマン]]
TypeScript の場合の実装例
const array: string[][] = [
  ["リンゴ", "イチゴ", "トマト"],
  ["メロン", "キュウリ", "ピーマン"],
];

console.log(array);

// [ [ 'リンゴ', 'イチゴ', 'トマト' ], [ 'メロン', 'キュウリ', 'ピーマン' ] ]
PHP の場合の実装例
<?php

$array = [
    ["リンゴ", "イチゴ", "トマト"],
    ["メロン", "キュウリ", "ピーマン"],
];

print_r($array);

// Array
// (
//     [0] => Array
//         (
//             [0] => リンゴ
//             [1] => イチゴ
//             [2] => トマト
//         )
//
//     [1] => Array
//         (
//             [0] => メロン
//             [1] => キュウリ
//             [2] => ピーマン
//         )
//
// )

▼ 連想配列

キー名 (赤、緑、果物、野菜) ごとに値が格納された配列型のこと。

下の例は、2 次元配列かつ連想配列である。

Go の場合の実装例
array := map[string]map[string][]string{
    "赤": {
        "果物": {"リンゴ", "イチゴ"},
        "野菜": {"トマト"},
    },
    "緑": {
        "果物": {"メロン"},
        "野菜": {"キュウリ", "ピーマン"},
    },
}

fmt.Println(array)

// map[緑:map[果物:[メロン] 野菜:[キュウリ ピーマン]] 赤:map[果物:[リンゴ イチゴ] 野菜:[トマト]]]
TypeScript の場合の実装例
const array: Record<string, Record<string, string[]>> = {
  赤: {
    果物: ["リンゴ", "イチゴ"],
    野菜: ["トマト"],
  },
  緑: {
    果物: ["メロン"],
    野菜: ["キュウリ", "ピーマン"],
  },
};

console.log(array);

// {
//   '赤': { '果物': [ 'リンゴ', 'イチゴ' ], '野菜': [ 'トマト' ] },
//   '緑': { '果物': [ 'メロン' ], '野菜': [ 'キュウリ', 'ピーマン' ] }
// }
PHP の場合の実装例
<?php

$array = [
    "赤" => [
        "果物" => ["リンゴ", "イチゴ"],
        "野菜" => ["トマト"],
    ],
    "緑" => [
        "果物" => ["メロン"],
        "野菜" => ["キュウリ", "ピーマン"],
    ],
];

print_r($array);

// Array
// (
//     [赤] => Array
//         (
//             [果物] => Array
//                 (
//                     [0] => リンゴ
//                     [1] => イチゴ
//                 )
//
//             [野菜] => Array
//                 (
//                     [0] => トマト
//                 )
//
//         )
//
//     [緑] => Array
//         (
//             [果物] => Array
//                 (
//                     [0] => メロン
//                 )
//
//             [野菜] => Array
//                 (
//                     [0] => キュウリ
//                     [1] => ピーマン
//                 )
//
//         )
//
// )


LinkedList 型

値をポインタによって順序通り並べたデータ格納形式のこと。

▼ 単方向リスト

単方向リストでは、各データが次のデータへのポインタのみを持つため、先頭から順にしかデータを辿れない。

p555-1

▼ 双方向リスト

双方向リストでは、各データが次のデータと前のデータの両方へのポインタを持つため、前後のどちらにもデータを辿れる。

p555-2

▼ 循環リスト

循環リストでは、最後尾のデータが先頭のデータへのポインタを持つため、リスト全体が環状につながり、最後尾から先頭に戻って辿り続けられる。

p555-3


キュー型

Queue1

矢印_80x82

Queue2

矢印_80x82

Queue3

配列の最後に要素を追加する処理と、配列の最初の要素を取り出す処理を組み合わせることにより、実装できる。

Go の場合の実装例
array := []string{"Blue", "Green"}

// 引数を、配列の最後に、要素として追加する。
array = append(array, "Red")
fmt.Println(array)

// 出力結果

// [Blue Green Red]

// 配列の最初の要素を取り出す。
theFirst := array[0]
array = array[1:]
fmt.Println(array)

// 出力結果

// [Green Red]

// 取り出された値の確認
fmt.Println(theFirst) // Blue
TypeScript の場合の実装例
const array: string[] = ["Blue", "Green"];

// 引数を、配列の最後に、要素として追加する。
array.push("Red");
console.log(array);

// 出力結果

// [ 'Blue', 'Green', 'Red' ]

// 配列の最初の要素を取り出す。
const theFirst = array.shift();
console.log(array);

// 出力結果

// [ 'Green', 'Red' ]

// 取り出された値の確認
console.log(theFirst); // Blue
PHP の場合の実装例
<?php
$array = array("Blue", "Green");

// 引数を、配列の最後に、要素として追加する。
array_push($array, "Red");
print_r($array);

// 出力結果

//  Array
//  (
//      [0] => Blue
//      [1] => Green
//      [2] => Red
//  )

// 配列の最初の要素を取り出す。
$theFirst = array_shift($array);
print_r($array);

// 出力結果

//  Array
//  (
//    [0] => Green
//    [1] => Red
//  )

// 取り出された値の確認
echo $theFirst; // Blue

▼ メッセージキュー

送信元の好きなタイミングでファイル (メッセージ) をメッセージキューに追加できる。

また、宛先の好きなタイミングでメッセージを取り出せる。

メッセージキュー


Stack 型

配列の最後に要素を追加する処理と、配列の最後の要素を取り出す処理で実装可能。

Stack1

矢印_80x82

Stack2

矢印_80x82

Stack3


Tree 型

▼ 二分探索木

各ノードにデータが格納されている。

二分探索木

▼ ヒープ

プライオリティキューを実現するときに使用される。

各ノードにデータが格納されている。

ヒープ1

矢印_80x82

ヒープ1

矢印_80x82

ヒープ2

矢印_80x82

.