システム開発

【基本情報】初心者向け!配列とリストの違いについて解説

お茶ん太
お茶ん太

この記事では、配列とリストについて、初心者にも分かりやすく図解付きで丁寧に解説しています!

配列

  • 変数はプログラム内で数字や文字列を入れる箱
  • 配列は複数の変数を1つにまとめたもので、長さを指定して定義する必要がある(長さが固定)添字でデータ位置を示すので直接データにアクセスできる特徴がある
  • 配列はデータの挿入と削除が苦手

リスト

  • リストも複数の変数を1つにまとめたものだが、配列と違い、ポインタを使って次のデータの場所を指定する
  • リストはデータにアクセスするとき、前から順番に辿っていく必要がある
  • リストはデータの挿入と削除が得意

変数と配列

変数とは数字や文字列等のデータを格納する箱のようなものです。変数を用意する時は、「変数の名前」と「変数に格納するデータ型」の2つを必ず決めます。

変数の箱を用意すれば、そこに値を格納することができます。変数に入れた値や文字を使ってプログラムは命令を処理します。

実際のプログラムで見てみましょう。例えば、ユーザに年齢を入力させて大人料金なのか子供料金なのか、メッセージを表示するプログラムでは、「age」が年齢を入れる変数になっています。

配列は、複数個の変数を1つにまとめたものです
配列には同じデータ型の変数が入りますが、それらを区別するのが添字です。配列内のデータにアクセスする時は、「2番目のデータを取得」のように添字を指定します。

配列は変数5個分みたいに長さを指定して定義するため、途中にデータを挿入したり削除することが苦手です。(完全に出来ないわけではありません)

実際に配列がプログラミングで使われている所を見てみましょう。下の例では、5人分の点数をscores()という配列に入れています。

ポインタを使うリスト

リストは配列と同じように複数の変数を1つにまとめて管理します。リストはポインタを使って次のデータがどこにあるのかを指定します。最初のデータからポインタを辿ることで目的のデータにアクセスします。

リストは配列と違い、データの追加や削除が簡単に行えます

リストはポインタを最初から順番に辿らないと、欲しいデータにアクセス出来ません。一方、配列は添字を指定することで直接データにアクセス出来ます。なので、欲しいデータに早くアクセスできるのは配列になります。

リストはポインタの持ち方によって分類されます。ここでは単方向リストと双方向リストを紹介します。

単方向リスト

単方向リストは一方通行で次のデータを指定するリストです。最も基本的な構造のリストですね。

双方向リスト

双方向リストは次のデータのポインタと、前のデータのポインタの両方を持つので、前後どちらにも辿ることが出来ます。

基本情報技術者試験での出題例

令和5年度問2

基本情報技術者
科目A 令和5年度問2

双方向のポインタをもつリスト構造のデータを表に示す。この表において新たな社員Gを社員Aと社員Kの間に追加する。追加後の表のポインタa~fの中で追加前と比べて値が変わるポインタだけを全て列記したものはどれか。

ア a,b,e,f   イ a,e,f   ウ a,f   エ b,e

正解と解説

正解は”ウ”

社員Gを追加する前のリストはこんな感じです。

ここに社員Gを追加してみましょう。変わるのは社員Aの次ポインタと社員Kの前ポインタですね。よって答えはウです。

平成30年度春期問6

基本情報技術者
午前試験 平成30年度春期問6

リストを二つの1次元配列で実現する。配列要素box[ i ]とnext[ i ]の対がリストの一つの要素に対応し,box[ i ]に要素の値が入り,next[ i ]に次の要素の番号が入る。配列が図の状態の場合,リストの3番目と4番目との間に値がHである要素を挿入したときのnext[ 8 ]の値はどれか。ここで,next[ 0 ]がリストの先頭(1番目)の要素を指し,next[ i ]の値が0である要素はリストの最後を示し,
next[ i ]の値が空白である要素はリストに連結されていない。

ア 3     イ 5     ウ 7     エ 8

正解と解説

正解は”ウ”

ややこしいので、まずはリストを並べてみましょう。

  • next[ 0 ]、つまり添字が1の要素がリストの先頭
  • next[ i ]の値が0である要素、つまりnext[ 2 ]はリストの最後
  • next[ i ]が空白の要素はリストに連結されていない

以上のことから、リストはこうなります。

ここにHの要素を足すとこうなります。よって、next[ 8 ]は7になります。

平成29年度春期問4

基本情報技術者
午前試験 平成29年度春期問4

データ構造の一つであるリストは,配列を用いて実現する場合と,ポインタを用いて実現する場合とがある。配列を用いて実現する場合の特徴はどれか。ここで,配列を用いたリストは,配列に要素を連続して格納することによって構成し,ポインタを用いたリストは,要素から次の要素へポインタで連結することによって構成するものとする。

ア 位置を指定して,任意のデータに直接アクセスすることができる。

イ 並んでいるデータの先頭に任意のデータを効率的に挿入することができる。

ウ 任意のデータの参照は効率的ではないが,削除や挿入の操作を効率的に行える。

エ 任意のデータを別の位置に移動する場合,隣接するデータを移動せずにできる。

正解と解説

正解は”ア”

配列は位置を指定することで目的のデータに直接アクセス可能です。

システム構成 PR

【基本情報】システム構成で使われる色々な技術を解説!

記事内に商品プロモーションを含む場合があります

この記事ではシステム構成で使われる様々な技術についてIT初心者にも分かりやすく解説します。

キャパシティプランニング

  • キャパシティプランニングとはシステムの構成案を考えるのに必要な手順。

スケールアウト・スケールアップ

  • スケールアウトはサーバの台数を増やすことでシステムの性能を上げる方法。
  • スケールアップはサーバの性能を上げることでシステムの性能を上げる方法。

サーバの仮想化

  • サーバの仮想化は1台の物理サーバに複数の仮想サーバを集約する方法。

ストアドプロシージャ

  • データベースに対して行う処理をあらかじめデータベースサーバ上に格納する技術。

基本情報ではシステム構成に関する様々な技術の問題が出題されます。是非最後までご覧ください。

キャパシティプランニング

システムを構成する時、むやみやたらにシステムを構築していけば必要なものが不足したり、逆に無駄に性能の良すぎるシステムを構築してしまう可能性があります。
では、どういった手順でシステムの構成案を考えていけば良いのでしょうか?
システム構成案を考えるのに必要な手順をキャパシティプランニングと言い、次の①~④で作業を行います。

  1. 現状のシステム構成を確認する。システムを構成するサーバの台数や性能等。
  2. システムを利用しているユーザから、新しく構成するシステムに
    どういった性能が必要かを確認する。
  3. ユーザにヒアリングした結果から、システムの構成案を検討する。
  4. 検討したシステムの構成案について必要に応じて見直しを行う。

キャパシティプランニングを行うことで、システムの性能を向上する技術の、適切な選定が出来るという訳ですね。
では、システムの性能を向上する技術にはどういったものがあるのでしょうか?基本情報で出題されたことがある技術について紹介していきます。

システムの性能を向上させる技術

スケールアウト・スケールアップ

スケールアウトとは、サーバの台数を増やしてシステムの性能を上げる方法です
それに対して、スケールアップとは、サーバのスペックを上げてシステムの性能を上げる方法です

スケールアウトとスケールアップのどちらが適しているかはシステムの性質によります。
サーバ間の整合性や処理順を意識しなくて良いシステムであれば単純にサーバを増やすだけでよいスケールアウトが向いています。しかし、サーバ間をまたがっての処理が多いようなシステムであればスケールアップが向いています。

(おまけ)スケールイン・スケールダウン
システム構成を検討した結果、現状のシステムの性能が過剰で無駄にコストが掛かってると分かることもあるでしょう。
スケールインはサーバの台数を減らすことで、スケールダウンはサーバのスペックを下げることでシステムのコストを削減します。

サーバの仮想化

仮想化とは

そもそも仮想化とはなんでしょうか。
結論から言うと、「なんちゃって〇〇」のことを仮想化と言います。

仮想の英訳はVirtualです。バーチャルユーチューバーとかバーチャルリアリティー(VR)のバーチャルですね。例えば、VRを使えば、実際目の前に海がある訳ではないのに、海にいるかのような体験が出来ます。
このように、実際にある訳ではないのに、あたかもそこにあるかのような振る舞いを見せることを仮想化と言います

サーバの仮想化とは

サーバの仮想化とは、1台の物理サーバに複数の仮想サーバを集約する技術です

複数台の物理サーバを持っていましたが、CPUの使用率は低く、効率的に使えていませんでした。そんな時、サーバの仮想化を行い、複数台の物理サーバで実現していた機能を1台の物理サーバに集約させました。すると、CPUを効率的に使えるようになりますし、管理する物理サーバの数も1台で良くなるので、管理コストも削減出来ます。

ストアドプロシージャ

ストアドプロシージャとは、データベース管理システム(DMBS)の機能の一つで、データベースサーバに対して行う複数の連続した処理を1つのプログラムとしてサーバに格納する技術です。クライアント等の外部からサーバに格納したプログラムを実行できます。

データベースとは、その名の通り、データを管理するサーバです。
それに対して外部PCに該当するクライアントやAPサーバは、プログラムの処理を行い、データの操作が必要になればデータベースに対してSQLを発行します。
SQLはデータベースを操作する言語で、データの参照・削除・登録・更新が出来ます。

では、本題のストアドプロシージャについて説明していきましょう。
以下の処理を例にストアドプロシージャを解説します。

直近1か月で10,000円以上の買い物をしたユーザは10%割引で買い物が出来る

普通に処理しようと思えば、以下のようになりますね。

  1. ユーザが商品を注文する
  2. クライアントがデータベースにユーザの「購買履歴」を要求
  3. クライアントがデータベースにユーザの「商品情報」を要求
  4. クライアントが「購買履歴」を確認し、直近1か月で10,000円以上買い物していたら、「商品情報」で取得した商品の金額を10%割引し、注文金額を算出
  5. 注文金額をユーザに表示

基本的にデータを使って処理するのはクライアントなので、クライアントは「購買履歴」と「商品情報」をデータベースから受け取る必要があります。

しかし、ユーザが商品を注文する度に「商品情報」だけでなく「購買履歴」もやり取りしないといけないのは少し面倒ですね。

そこで、「直近1か月で10,000以上買い物していたら10%割引した商品の金額を返す」という命令(ストアドプログラム)をデータベースに格納しておきましょう。

すると、処理の流れはこうなります。

  1. ユーザが商品を注文する
  2. クライアントがデータベースのストアドプログラムを呼び出し、
    注文金額を受け取る
  3. 注文金額をユーザに表示

このようにストアドプログラムをあらかじめデータベースに格納しておくことで、クライアント – データベースサーバ間のやり取りを最小限にすることができるので、処理速度を速くできたり、ネットワーク負荷を軽減出来ます。これがストアドプロシージャです。

基本情報技術者試験での出題例

サンプル問題問13

基本情報技術者
科目A サンプル問題問13

仮想化マシン環境を物理マシン20台で運用しているシステムがある。次の運用条件のとき,物理マシンが最低何台停止すると縮退運転になるか。

〔運用条件〕
(1) 物理マシンが停止すると,そこで稼働していた仮想マシンは他の全ての物理マシンで均等に稼働させ,使用していた資源も同様に配分する。
(2) 物理マシンが20台のときに使用する資源は,全ての物理マシンにおいて70%である。
(3) 1台の物理マシンで使用している資源が90%を超えた場合,システム全体が縮退運転となる。
(4) (1)~(3)以外の条件は考慮しなくてよい。

ア 2      イ 3      ウ 4      エ 5

正解と解説

正解は”エ”

最初は20台の物理マシンを均等に使いながら、仮想化マシンを運用します。
20台の物理マシンを使っている時は、1台ずつ70%の資源を使います。
1台の物理マシンが使える資源をMAX「100」とした場合、それぞれの物理マシンは「70」の資源を使っています。なので、仮想化マシンの運用には「70」×20台=「1400」の資源を使うということですね。

物理マシンが停止した場合は、残っている物理マシンで仮想化マシンを運用します。
仮想化マシンの運用には「1400」の資源が必要なので、19台の物理マシンで運用するには、1台のマシンで「1400」÷19=「約74」の資源を使います。

このように物理マシンの数が減っていくと、それぞれの物理マシンに必要な資源は多くなっていきます。物理マシンが14台まで減ってしまうと、1台が負担する資源は「1400」÷14=「100」となり、全てがMAXで動かないといけなくなります。これでは余裕がなく、いつ仮想化マシン自体が止まるか分かりません。そこで、1台が負担する資源が「90」を超えたら、仮想化マシンの一部を止めて運用します。これを縮退運転と言います。

では、何台に仮想化マシンが止まれば、1台が負担する資源が「90」を超えるのでしょうか?1台が負担する資源が「90」の場合、「1400」÷「90」=15.6台となります。
と言うことは、15台の場合は「90」と超えて、16台の場合は「90」を超えないということですね。

実際に計算してみると、
16台の場合、「1400」÷16台=「87.5」
15台の場合、「1400」÷15台=「93.3」
となります。

よって、答えは5台のエとなります。

平成30年度秋期問14

基本情報技術者
午前試験 平成30年度秋期問14

稼働状況が継続的に監視されているシステムがある。稼働して数年後に新規業務をシステムに適用する場合に実施する,キャパシティプランニングの作業項目の順序として,適切なものはどれか。

〔キャパシティプランニングの作業項目〕
① システム構成の案について,適正なものかどうかを評価し,必要があれば見直しを行う。

② システム特性に合わせて,サーバの台数,並列分散処理の実施の有無など,必要なシステム構成の案を検討する。

③ システムの稼働状況から,ハードウェアの性能情報やシステム固有の環境を把握する。

④ 利用者などに新規業務をヒアリングし,想定される処理件数や処理に要する時間といったシステムに求められる要件を把握する。

ア ③,②,④,①
ウ ④,②,①,③

イ ③,④,②,①
エ ④,③,①,②

正解と解説

正解は”イ”

システム構成案を作成する手順をキャパシティプランニングと言います。
ア~エの手順がシステム構成案を作成するのに適切な手順か見ていきましょう。誤りの選択肢は明らかにおかしな所があります。

ア ②(システム構成の案を検討する)→④(利用者にシステムに必要な要件を聞く)とありますが、まずシステムに何が必要かを利用者に聞いてから、構成案を考えないといけませんよね。よって、おかしいことが分かります。

ウ 一番最後に③(現在のハードウェアやシステムの状況を把握する)とありますが、現状の把握は早い段階で行うべきですよね。でないと、何が足りていないのかを把握することができません。よって、おかしいことが分かります。

エ ①(システム構成案の見直しをする)→②(システム構成の案を検討する)とありますが、検討したシステム構成案に対して、見直しをしていくのが普通だと思うので、おかしいことが分かります。

よって、答えはイです。

平成30年度春期問15

基本情報技術者
午前試験 平成30年度春期問15

システムのスケールアウトに関する記述として,適切なものはどれか。

ア 既存のシステムにサーバを追加導入することによって,システム全体の処理能力を向上させる。

イ 既存のシステムのサーバの一部又は全部を,クラウドサービスなどに再配置することによって,システム運用コストを下げる。

ウ 既存のシステムのサーバを,より高性能なものと入れ替えることによって,個々のサーバの処理能力を向上させる。

エ 一つのサーバをあたかも複数のサーバであるかのように見せることによって,システム運用コストを下げる。

正解と解説

正解は”ア”

スケールアウトでは、サーバを追加導入することでシステム全体の処理能力を向上させます。

平成29年度秋期問26

基本情報技術者
午前試験 平成29年度秋期問26

クライアントサーバシステムにおいて,利用頻度の高い命令群をあらかじめサーバ上のDBMSに格納しておくことによって,クライアントサーバ間のネットワーク負荷を軽減する仕組みはどれか。

ア 2相コミットメント

イ グループコミットメント

ウ サーバプロセスのマルチスレッド化

エ ストアドプロシージャ

正解と解説

正解は”エ”

ストアドプロシージャは利用頻度の高い命令をDBMSに保管しておくことでクライアントサーバ間のネットワーク負荷を軽減します。

平成29年度春期問12

基本情報技術者
午前試験 平成29年度春期問12

システムの性能を向上させるために,スケールアウトが適しているシステムはどれか。

ア 一連の大きな処理を一括して実行しなければならないので,並列処理が困難な処理が中心のシステム

イ 参照系のトランザクションが多いので,複数のサーバで分散処理を行っているシステム

ウ データを追加するトランザクションが多いので,データの整合性を取るためのオーバーヘッドを小さくしなければならないシステム

エ 同一のマスタデータベースがシステム内に複数配置されているので,マスタを更新する際にはデータベース間で整合性を保持しなければならないシステム

正解と解説

正解は”イ”

スケールアウトでは、サーバを追加導入することでシステム全体の処理能力を向上させます。