IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特開2024-77758情報処理プログラム、情報処理方法、および情報処理装置
<>
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図1
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図2
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図3
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図4
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図5
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図6
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図7
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図8
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図9
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図10
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図11
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図12
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図13
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図14
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図15
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図16
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図17
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図18
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図19
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図20
  • 特開-情報処理プログラム、情報処理方法、および情報処理装置 図21
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024077758
(43)【公開日】2024-06-10
(54)【発明の名称】情報処理プログラム、情報処理方法、および情報処理装置
(51)【国際特許分類】
   G06F 16/28 20190101AFI20240603BHJP
【FI】
G06F16/28
【審査請求】未請求
【請求項の数】9
【出願形態】OL
(21)【出願番号】P 2022189893
(22)【出願日】2022-11-29
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100104190
【弁理士】
【氏名又は名称】酒井 昭徳
(72)【発明者】
【氏名】河東 孝
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175CA07
5B175KA13
(57)【要約】
【課題】データ量の増大化を抑制すること。
【解決手段】情報処理装置100は、複数のブロック列500を記憶する。情報処理装置100は、それぞれのブロック列500の末尾のブロック510に存在する、成分の値を格納されない所定数-2個未満の末尾領域611を、末尾領域611を連結した末尾領域列620として管理する。情報処理装置100は、末尾領域列620がフル状態になったか否かを示すフラグ情報630を記憶する。情報処理装置100は、末尾領域611の状態に応じて、当該末尾領域611を含むブロック列500が、フル状態であるか否かを管理する。
【選択図】図6
【特許請求の範囲】
【請求項1】
配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
処理をコンピュータに実行させ、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理プログラム。
【請求項2】
前記第2領域は、前記第2領域を含むブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアに対応付けられ、
前記それぞれのブロック列の末尾ブロックの前記第2領域を連結した第2領域列について、前記第2領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の前記ペアに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する前記ペアを分配するよう、前記第2領域列を管理することにより、少なくとも、末尾領域の一部の領域が、前記ペアを格納しない未使用領域になるよう、前記第2領域列を管理し、当該一部の領域に、前記第2領域列を分割する可変の位置を示すポインタと、前記第2領域列において値が未設定の前記ペアの初期値とを保持する、
処理を前記コンピュータに実行させることを特徴とする請求項1に記載の情報処理プログラム。
【請求項3】
前記第1領域列を管理する処理は、
前記第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配することにより、少なくとも、末尾領域の一部の領域が、成分の値を格納しない未使用領域になるよう、前記第1領域列を管理し、当該一部の領域に、前記第1領域列を分割する可変の位置を示すポインタと、前記第1領域列において値が未設定の成分の初期値とを保持する、ことを特徴とする請求項2に記載の情報処理プログラム。
【請求項4】
前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記第2領域列の末尾の領域の一部の領域に、前記第2領域列を分割する位置として前記第2領域列の先頭を示すポインタと、前記第2領域列において値が未設定の前記ペアの初期値とを格納し、
前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記第1領域列の末尾の領域の一部の領域に、前記第1領域列を分割する位置として前記第1領域列の先頭を示すポインタと、前記第1領域列において値が未設定の成分の初期値とを格納し、
前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記フラグ情報が、前記第1領域列において、前記オプション領域が存在しないことを示す値であれば、前記オプション領域が存在することを示す値に更新する、
処理を前記コンピュータに実行させることを特徴とする請求項3に記載の情報処理プログラム。
【請求項5】
前記複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記いずれかのブロック列に存在する前記第2領域に対応するペアに、前記いずれかのブロック列を分割する位置として前記いずれかのブロック列の先頭を示すポインタと、前記いずれかのブロック列において値が未設定の成分の初期値とのペアを設定するよう、前記いずれかのブロック列に対応する前記第2領域を更新し、
前記いずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記第1領域列のうち、前記いずれかのブロック列に対応する前記第1領域が、前記オプション領域になるよう、前記第1領域列を更新し、
前記いずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記フラグ情報が、前記第1領域列において、前記オプション領域が存在しないことを示す値であれば、前記オプション領域が存在することを示す値に更新する、
処理を前記コンピュータに実行させることを特徴とする請求項4に記載の情報処理プログラム。
【請求項6】
前記配列のいずれかの成分の値の書き込み要求を受け付けたことに応じて、前記複数のブロック列のうち、前記いずれかの成分に対応する書き込み先ブロックを特定し、
特定した前記書き込み先ブロックが、前記オプションブロックである場合、特定した前記書き込み先ブロックに対応する所定数の成分のうち、前記いずれかの成分の値と、前記いずれかの成分とは異なる残余の成分の初期値とを、特定した前記書き込み先ブロックに書き込み、
特定した前記書き込み先ブロックが、前記オプションブロックではない場合、前記いずれかの成分の値を、特定した前記書き込み先ブロックに書き込む、
処理を前記コンピュータに実行させることを特徴とする請求項4または5に記載の情報処理プログラム。
【請求項7】
前記配列のいずれかの成分の値の読み出し要求を受け付けたことに応じて、前記複数のブロック列のうち、前記いずれかの成分に対応する読み出し元ブロックを特定し、
特定した前記読み出し元ブロックが、前記オプションブロックである場合、特定した前記読み出し元ブロックに対応する前記第2領域が、値が未設定の前記ペアに対応するオプション領域であれば、前記第2領域列の末尾の領域の一部の領域から、前記いずれかの成分の初期値を読み出し、
特定した前記読み出し元ブロックが、前記オプションブロックである場合、特定した前記読み出し元ブロックに対応する前記第2領域が、値が未設定の前記ペアに対応するオプション領域でなければ、特定した前記読み出し元ブロックに対応する前記第2領域から、前記いずれかの成分の初期値を読み出し、
特定した前記読み出し元ブロックが、前記オプションブロックではない場合、特定した前記読み出し元ブロックから、前記いずれかの成分の値を読み出す、
処理を前記コンピュータに実行させることを特徴とする請求項4または5に記載の情報処理プログラム。
【請求項8】
配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
処理をコンピュータが実行し、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理方法。
【請求項9】
配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
制御部を有し、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理プログラム、情報処理方法、および情報処理装置に関する。
【背景技術】
【0002】
従来、配列の所定数の成分の値を格納可能なブロックを連結した、Block wise Optional Arrayと呼ばれるデータ構造のブロック列を用いて、当該配列を表現する技術がある。例えば、ブロック列を、前後2つの範囲に分割し、前半の範囲に、配列の成分の値が未格納の前方ブロックが存在すれば、後半の範囲に存在する後方ブロックに格納することが要求された一部の成分の値を、当該前方ブロックに分配するよう管理することがある。例えば、ブロック列ごとに、当該ブロック列を分割する可変の位置を示すスタックポインタと、当該ブロック列に配列の全成分が格納済みであるか否かを示すフラグ情報とを記憶することになる。
【0003】
先行技術としては、例えば、複数のブロックを二分割した第1領域内の未書き込みブロックの数と、二分割した第2領域内の書き込み済みブロックの数とが整数比になる位置を境界とする、複数のブロックを連結して構成した配列を制御するものがある。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2018-037010号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、従来技術では、複数の配列を表現する際にデータ量の増大化を招くという問題がある。例えば、配列ごとに、当該配列を表現するブロック列に、配列の全成分が格納済みであるか否かを示すフラグ情報を用意すると、データ量の増大化を招く。
【0006】
1つの側面では、本発明は、データ量の増大化を抑制することを目的とする。
【課題を解決するための手段】
【0007】
1つの実施態様によれば、配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶し、前記それぞれのブロック列を、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱い、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱う情報処理プログラム、情報処理方法、および情報処理装置が提案される。
【発明の効果】
【0008】
一態様によれば、データ量の増大化を抑制することが可能になる。
【図面の簡単な説明】
【0009】
図1図1は、実施の形態にかかる情報処理方法の一実施例を示す説明図である。
図2図2は、情報処理システム200の一例を示す説明図である。
図3図3は、情報処理装置100のハードウェア構成例を示すブロック図である。
図4図4は、情報処理装置100の機能的構成例を示すブロック図である。
図5図5は、ブロック列500のデータ構造の一例を示す説明図である。
図6図6は、複数のブロック列500を記憶する第1の例を示す説明図である。
図7図7は、複数のブロック列500を記憶する第2の例を示す説明図である。
図8図8は、情報処理装置100の適用例を示す説明図(その1)である。
図9図9は、情報処理装置100の適用例を示す説明図(その2)である。
図10図10は、情報処理装置100の適用例を示す説明図(その3)である。
図11図11は、情報処理装置100の適用例を示す説明図(その4)である。
図12図12は、情報処理装置100の適用例を示す説明図(その5)である。
図13図13は、情報処理装置100の適用例を示す説明図(その6)である。
図14図14は、情報処理装置100の適用例を示す説明図(その7)である。
図15図15は、情報処理装置100の適用例を示す説明図(その8)である。
図16図16は、情報処理装置100の適用例を示す説明図(その9)である。
図17図17は、情報処理装置100の適用例を示す説明図(その10)である。
図18図18は、全体初期化処理手順の一例を示すフローチャートである。
図19図19は、行初期化処理手順の一例を示すフローチャートである。
図20図20は、書き込み処理手順の一例を示すフローチャートである。
図21図21は、読み出し処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【0010】
以下に、図面を参照して、本発明にかかる情報処理プログラム、情報処理方法、および情報処理装置の実施の形態を詳細に説明する。
【0011】
(実施の形態にかかる情報処理方法の一実施例)
図1は、実施の形態にかかる情報処理方法の一実施例を示す説明図である。情報処理装置100は、複数の配列を記憶するためのコンピュータである。情報処理装置100は、例えば、サーバ、または、PC(Personal Computer)などである。
【0012】
配列は、例えば、リアルタイム取引、オンラインゲーム、自動運転、または、セキュリティ対策などに活用されるデータであることが考えられる。配列を活用する観点から、配列を管理する際にかかる処理負担および処理時間の低減化を図ることが望まれる。例えば、配列の成分を初期化し易くすることが望まれる。
【0013】
このため、配列を、特殊なデータ構造のブロック列によって表現することが考えられる。例えば、ブロック列のデータ構造に、Block wise Optional Arrayと呼ばれるデータ構造を採用することが考えられる。
【0014】
例えば、Block wise Optional Arrayと呼ばれるデータ構造のブロック列は、前後2つの範囲に分割される。ブロック列を分割する位置は、可変である。例えば、ブロック列に、配列の成分の値が格納されたことに応じて、ブロック列を分割する位置が、変更されることがある。
【0015】
以下の説明では、ブロックに対応付けられた所定数の成分のうち、いずれの成分の値も未設定である場合、当該ブロックの状態を「オプション状態(option)」と表記する場合がある。例えば、ブロックに対応付けられたいずれの成分の値も、まだ格納することが要求されていなければ、当該ブロックは、オプション状態となる。また、以下の説明では、ブロックに対応付けられた所定数の成分のうち、少なくともいずれかの成分の値が設定された場合、当該ブロックの状態を「バリュー状態(value)」と表記する場合がある。
【0016】
また、以下の説明では、ブロック列に、配列の全成分が格納済みであり、オプション状態のブロックが存在しない場合、当該ブロック列の状態を「フル状態(full)」と表記する場合がある。また、以下の説明では、値が未設定の配列の成分が存在し、ブロック列に、オプション状態のブロックが存在する場合、当該ブロック列の状態を「ノットフル状態(notfull)」と表記する場合がある。
【0017】
例えば、ブロック列を分割した前半の範囲に、オプション状態の前方ブロックが存在する場合には、当該前方ブロックに、後半の範囲に存在するバリュー状態の後方ブロックに対応付けられた一部の成分の値を分配するよう、当該ブロック列を管理することがある。これにより、ブロック列が、ノットフル状態である場合には、少なくとも、当該ブロック列の末尾ブロックの一部が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理することがある。ブロック列が、フル状態である場合には、当該ブロック列に、配列の全成分が格納済みであるため、当該ブロック列の末尾ブロックは、成分の値を格納しない未使用領域を含まない。
【0018】
例えば、配列の成分を初期化し易くするために、例えば、ブロック列に対応付けて、初期値を記憶しておき、当該ブロック列のうち、オプション状態のブロックに対応付けられた所定数の成分の値は、記憶しておいた初期値と見做す。また、初期値を、ブロック列内に格納するよう、Block wise Optional Arrayと呼ばれるデータ構造を拡張した、Optimal Space Initializable Array(OSIA)と呼ばれるデータ構造がある。
【0019】
Optimal Space Initializable Arrayと呼ばれるデータ構造では、初期値は、例えば、ブロック列の末尾ブロックの未使用領域を利用して保持される。Optimal Space Initializable Arrayと呼ばれるデータ構造に関しては、上述した特許文献1を参照することができる。
【0020】
ここで、例えば、ブロック列ごとに、当該ブロック列を分割する可変の位置を管理し、当該ブロック列が、フル状態であるか、または、ノットフル状態であるかを管理することが望まれる。具体的には、ブロック列の各ブロックが、オプション状態であるか、または、バリュー状態であるかを区別可能にするために、当該ブロック列を分割する可変の位置を管理し、当該ブロック列が、フル状態であるか否かを管理することが望まれる。
【0021】
従来では、例えば、ブロック列に対応付けて、当該ブロック列を分割する可変の位置を管理するために、当該ブロック列を分割する可変の位置を示すスタックポインタを記憶することになる。スタックポインタは、例えば、ブロック列の末尾ブロックの未使用領域を利用して保持されてもよい。また、従来では、例えば、ブロック列に対応付けて、当該ブロック列が、フル状態であるか、または、ノットフル状態であるかを管理するために、当該ブロック列が、フル状態であるか否かを示すフラグ情報を記憶することになる。
【0022】
しかしながら、従来では、複数の配列を表現するために、それぞれ異なる配列を表す複数のブロック列を記憶する際にかかるデータ量の増大化を招くという問題がある。例えば、配列ごとに、当該配列を表すブロック列に対応付けて、フラグ情報を記憶することになるため、表現する配列の数が多いほど、データ量の増大化を招くことになる。
【0023】
そこで、本実施の形態では、それぞれ異なる配列を表す複数のブロック列を記憶する際にかかるデータ量の増大化を抑制することができる情報処理方法について説明する。
【0024】
図1において、情報処理装置100は、配列の所定数の成分に対応付けられたブロック111を連結した、それぞれ異なる配列を表す複数のブロック列110を記憶する。情報処理装置100は、例えば、それぞれ異なる配列を表す、Optimal Space Initializable Arrayと呼ばれるデータ構造のブロック列を記憶する。
【0025】
(1-1)情報処理装置100は、それぞれのブロック列110を、2つの範囲に分割して管理する。情報処理装置100は、前半の範囲に、オプション状態の前方ブロック111fがあれば、当該前方ブロック111fに、後半の範囲にあるバリュー状態の後方ブロック111bに対応する一部の成分の値を分配するよう、それぞれのブロック列110を管理する。これにより、情報処理装置100は、それぞれのブロック列110について、少なくとも、末尾ブロック111tの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列110を管理することができる。
【0026】
(1-2)情報処理装置100は、それぞれのブロック列110の末尾ブロック111tの複数の領域のうち第1領域121を連結し、第1領域列120として管理する。情報処理装置100は、例えば、第1領域列120を、Optimal Space Initializable Arrayと呼ばれるデータ構造として管理する。以下の説明では、ブロック111と同様に、第1領域121に対応付けられた成分のうち、いずれの成分の値も未設定である場合、当該第1領域121の状態を「オプション状態(option)」と表記する場合がある。以下の説明では、ブロック111と同様に、第1領域121に対応付けられた成分のうち、少なくともいずれかの成分の値が設定された場合、当該第1領域121の状態を「バリュー状態」と表記する場合がある。
【0027】
(1-3)情報処理装置100は、第1領域列120を、2つの範囲に分割して管理する。情報処理装置100は、前半の範囲に、オプション状態の前方領域121があれば、当該前方領域121に、後半の範囲にある後方領域121に対応する一部の成分の値を分配するよう、第1領域列120を管理する。
【0028】
(1-4)情報処理装置100は、それぞれのブロック列110を分割する可変の位置を示すポインタspと、それぞれのブロック列110において値が未設定の成分の初期値ivとを保持する。情報処理装置100は、例えば、それぞれのブロック列110の末尾ブロック111tの複数の領域のうち第2領域131を利用して、それぞれのブロック列110に関する、ポインタspと、初期値ivとのペアを保持する。
【0029】
情報処理装置100は、具体的には、それぞれのブロック列110について、当該ブロック列の末尾ブロック111tの第2領域131に、当該ブロック列110に関する、ポインタspと、初期値ivとのペアを格納することにより保持する。これにより、情報処理装置100は、それぞれのブロック列110を分割する可変の位置を適切に管理することができ、それぞれのブロック列110において値が未設定の成分の初期値ivを適切に管理することができる。
【0030】
(1-5)情報処理装置100は、第1領域列120において、オプション状態の第1領域121が存在するか否かを示すフラグ情報140を記憶する。フラグ情報140は、例えば、値が0であれば、オプション状態の第1領域121が存在することを示す。フラグ情報140は、例えば、値が1であれば、オプション状態の第1領域121が存在しないことを示す。これにより、情報処理装置100は、第1領域列120において、それぞれの第1領域121が、オプション状態であるか、または、バリュー状態であるかを適切に管理することができる。
【0031】
(1-6)情報処理装置100は、それぞれのブロック列110について、フラグ情報140を用いて、末尾ブロック111tの一部である第1領域121が、オプション状態であるか否かを判定する。ここで、情報処理装置100は、いずれかのブロック列110について、末尾ブロック111tの一部である第1領域121が、オプション状態であると判定した場合、当該ブロック列110を、ノットフル状態であると扱うことにする。一方で、情報処理装置100は、いずれかのブロック列110について、末尾ブロック111tの一部である第1領域121が、オプション状態ではないと判定した場合、当該ブロック列110を、フル状態であると扱うことにする。
【0032】
これにより、情報処理装置100は、ブロック列110ごとに、当該ブロック列110が、フル状態であるか、または、ノットフル状態であるかを示すフラグ情報を用意せずに済ませることができる。このため、情報処理装置100は、それぞれ異なる配列を表す複数のブロック列を記憶する際にかかるデータ量の増大化を抑制することができる。
【0033】
ここでは、情報処理装置100が、ブロック列の末尾ブロック111tの第2領域131を、それぞれ独立した領域として管理する場合について説明したが、これに限らない。例えば、情報処理装置100が、それぞれのブロック列110の末尾ブロック111tの複数の領域のうち第2領域131を連結し、第2領域列として管理する場合があってもよい。具体的には、情報処理装置100は、第2領域列を、Optimal Space Initializable Arrayと呼ばれるデータ構造として管理する。
【0034】
ここでは、情報処理装置100が、単独で動作する場合について説明したが、これに限らない。例えば、情報処理装置100が、他のコンピュータと協働する場合があってもよい。具体的には、情報処理装置100が、複数のブロック列110を記憶する他のコンピュータを制御する場合があってもよい。例えば、複数のコンピュータが、協働して情報処理装置100としての機能を実現する場合があってもよい。具体的には、クラウド上に、情報処理装置100としての機能が実現される場合があってもよい。
【0035】
(情報処理システム200の一例)
次に、図2を用いて、図1に示した情報処理装置100を適用した、情報処理システム200の一例について説明する。
【0036】
図2は、情報処理システム200の一例を示す説明図である。図2において、情報処理システム200は、情報処理装置100と、情報蓄積装置201と、クライアント装置202とを含む。
【0037】
情報処理システム200において、情報処理装置100と情報蓄積装置201とは、有線または無線のネットワーク210を介して接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。また、情報処理システム200において、情報処理装置100とクライアント装置202とは、有線または無線のネットワーク210を介して接続される。
【0038】
情報蓄積装置201は、それぞれ異なる配列を表す複数のブロック列を記憶するためのコンピュータである。情報蓄積装置201は、例えば、それぞれOptimal Space Initializable Arrayと呼ばれるデータ構造である複数のブロック列を記憶する。情報蓄積装置201は、例えば、情報処理システム200を管理するシステム管理者によって用いられる。
【0039】
情報蓄積装置201は、複数のブロック列のそれぞれのブロック列の末尾ブロックの複数の領域のうち第1領域を連結した第1領域列を、Optimal Space Initializable Arrayと呼ばれるデータ構造として扱う。情報蓄積装置201は、複数のブロック列のそれぞれのブロック列の末尾ブロックの複数の領域のうち第2領域を連結した第2領域列を、Optimal Space Initializable Arrayと呼ばれるデータ構造として扱う。
【0040】
情報蓄積装置201は、それぞれのブロック列を分割する位置を示すスタックポインタを記憶する。情報蓄積装置201は、例えば、それぞれのブロック列を分割する位置を示すスタックポインタを、第2領域列を用いて記憶するよう、それぞれのブロック列を管理する。情報蓄積装置201は、第1領域列に、オプション状態の第1領域が存在するか否かを示すフラグ情報を記憶する。
【0041】
情報蓄積装置201は、情報処理装置100の制御に従って、ブロック列を制御する。情報蓄積装置201は、情報処理装置100の制御に従って、ブロック列に対して配列の成分の値を格納する。情報蓄積装置201は、情報処理装置100の制御に従って、ブロック列を分割する位置を示すスタックポインタ、第1領域列を分割する位置を示すスタックポインタ、および、第2領域列を分割する位置を示すスタックポインタなどを更新する。情報蓄積装置201は、情報処理装置100の制御に従って、フラグ情報を更新する。情報蓄積装置201は、例えば、サーバ、または、PCなどである。
【0042】
情報処理装置100は、情報蓄積装置201を制御するためのコンピュータである。情報処理装置100は、例えば、情報処理システム200を管理するシステム管理者によって用いられる。
【0043】
情報処理装置100は、配列の成分の値を格納することを要求する格納要求を取得する。情報処理装置100は、例えば、格納要求を、クライアント装置202から受信することにより取得する。情報処理装置100は、例えば、システム管理者の操作入力に基づき、格納要求の入力を受け付けることにより、格納要求を取得してもよい。情報処理装置100は、格納要求に応じて、情報蓄積装置201を制御することにより、複数のブロック列を制御する。
【0044】
情報処理装置100は、ブロック列を初期化することを要求する個別初期化要求を取得する。情報処理装置100は、例えば、個別初期化要求を、クライアント装置202から受信することにより取得する。情報処理装置100は、例えば、システム管理者の操作入力に基づき、個別初期化要求の入力を受け付けることにより、個別初期化要求を取得してもよい。情報処理装置100は、個別初期化要求に応じて、情報蓄積装置201を制御することにより、複数のブロック列を制御する。
【0045】
情報処理装置100は、複数のブロック列の全体を初期化することを要求する全体初期化要求を取得する。情報処理装置100は、例えば、全体初期化要求を、クライアント装置202から受信することにより取得する。情報処理装置100は、例えば、システム管理者の操作入力に基づき、全体初期化要求の入力を受け付けることにより、全体初期化要求を取得してもよい。情報処理装置100は、全体初期化要求に応じて、情報蓄積装置201を制御することにより、複数のブロック列を制御する。情報処理装置100は、例えば、サーバ、または、PCなどである。
【0046】
クライアント装置202は、情報処理システム200を利用するシステム利用者によって用いられるコンピュータである。クライアント装置202は、システム利用者の操作入力に基づき、格納要求、個別初期化要求、または、全体初期化要求などを生成し、情報処理装置100に送信する。クライアント装置202は、例えば、PC、タブレット端末、または、スマートフォンなどである。
【0047】
ここでは、情報処理装置100が、情報蓄積装置201とは異なる装置である場合について説明したが、これに限らない。例えば、情報処理装置100が、情報蓄積装置201としての機能を有し、情報蓄積装置201としても動作する場合があってもよい。ここでは、情報処理装置100が、クライアント装置202とは異なる装置である場合について説明したが、これに限らない。例えば、情報処理装置100が、クライアント装置202としての機能を有し、クライアント装置202としても動作する場合があってもよい。
【0048】
(情報処理装置100の適用例)
次に、情報処理装置100の適用例について説明する。情報処理装置100は、例えば、複数の組織のそれぞれの組織が提供する商品の価格管理の用途に適用することができる。組織は、例えば、企業である。情報処理装置100は、例えば、組織ごとに、当該組織が提供する2以上の商品のそれぞれの商品の価格を、成分の値として保持する配列を表すブロック列を纏めた、複数のブロック列を記憶し、管理する。これにより、情報処理装置100は、それぞれの組織が提供する商品の価格管理の際にかかるデータ量の低減化を図ることができる。情報処理装置100は、それぞれの組織が提供する商品の価格を適切に管理することができる。
【0049】
(情報処理装置100のハードウェア構成例)
次に、図3を用いて、情報処理装置100のハードウェア構成例について説明する。
【0050】
図3は、情報処理装置100のハードウェア構成例を示すブロック図である。図3において、情報処理装置100は、CPU(Central Processing Unit)301と、メモリ302と、ネットワークI/F(Interface)303と、記録媒体I/F304と、記録媒体305とを有する。また、各構成部は、バス300によってそれぞれ接続される。
【0051】
ここで、CPU301は、情報処理装置100の全体の制御を司る。メモリ302は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU301のワークエリアとして使用される。メモリ302に記憶されるプログラムは、CPU301にロードされることにより、コーディングされている処理をCPU301に実行させる。
【0052】
ネットワークI/F303は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、ネットワークI/F303は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワークI/F303は、例えば、モデムやLANアダプタなどである。
【0053】
記録媒体I/F304は、CPU301の制御に従って記録媒体305に対するデータのリード/ライトを制御する。記録媒体I/F304は、例えば、ディスクドライブ、SSD(Solid State Drive)、USB(Universal Serial Bus)ポートなどである。記録媒体305は、記録媒体I/F304の制御で書き込まれたデータを記憶する不揮発メモリである。記録媒体305は、例えば、ディスク、半導体メモリ、USBメモリなどである。記録媒体305は、情報処理装置100から着脱可能であってもよい。
【0054】
情報処理装置100は、上述した構成部の他、例えば、キーボード、マウス、ディスプレイ、プリンタ、スキャナ、マイク、スピーカーなどを有してもよい。また、情報処理装置100は、記録媒体I/F304や記録媒体305を複数有していてもよい。また、情報処理装置100は、記録媒体I/F304や記録媒体305を有していなくてもよい。
【0055】
(情報蓄積装置201のハードウェア構成例)
情報蓄積装置201のハードウェア構成例は、具体的には、図3に示した情報処理装置100のハードウェア構成例と同様であるため、説明を省略する。
【0056】
(クライアント装置202のハードウェア構成例)
クライアント装置202のハードウェア構成例は、具体的には、図3に示した情報処理装置100のハードウェア構成例と同様であるため、説明を省略する。
【0057】
(情報処理装置100の機能的構成例)
次に、図4を用いて、情報処理装置100の機能的構成例について説明する。
【0058】
図4は、情報処理装置100の機能的構成例を示すブロック図である。情報処理装置100は、記憶部400と、取得部401と、管理部402と、更新部403と、格納部404と、読出部405と、出力部406とを含む。
【0059】
記憶部400は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域によって実現される。以下では、記憶部400が、情報処理装置100に含まれる場合について説明するが、これに限らない。例えば、記憶部400が、情報処理装置100とは異なる装置に含まれ、記憶部400の記憶内容が情報処理装置100から参照可能である場合があってもよい。
【0060】
取得部401~出力部406は、制御部の一例として機能する。取得部401~出力部406は、具体的には、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶されたプログラムをCPU301に実行させることにより、または、ネットワークI/F303により、その機能を実現する。各機能部の処理結果は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶される。
【0061】
記憶部400は、各機能部の処理において参照され、または更新される各種情報を記憶する。記憶部400は、例えば、配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶する。それぞれのブロック列は、Block-wise Optional Arrayのデータ構造として扱われる。それぞれのブロック列は、例えば、前後2つの範囲に分割される。
【0062】
ブロック列のブロックに対応付けられた所定数の成分の値が未設定である場合、当該ブロックの状態を「オプション状態」と表記する場合がある。ブロック列のブロックに対応付けられた所定数の成分のうち少なくともいずれかの成分の値が設定される場合、当該ブロックの状態を「バリュー状態」と表記する場合がある。それぞれのブロック列の末尾ブロックは、複数の領域に区分されていてもよい。複数の領域は、例えば、第1領域と、第2領域とを含む。第2領域は、例えば、当該第2領域を含むブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアに対応付けられる。
【0063】
ここで、それぞれのブロック列の末尾ブロックの複数の領域のうち第1領域は、例えば、第1領域列を形成する。第1領域列は、例えば、複数のブロック列に跨って、それぞれのブロック列の末尾ブロックの複数の領域のうち第1領域を順に連結した領域列である。第1領域列は、例えば、Block-wise Optional Arraのデータ構造として扱われる。第1領域に対応付けられたすべての成分の値が未設定である場合、当該第1領域の状態を「オプション状態」と表記する場合がある。第1領域に対応付けられた少なくともいずれかの成分の値が設定される場合、当該第1領域の状態を「バリュー状態」と表記する場合がある。
【0064】
また、それぞれのブロック列の末尾ブロックの複数の領域のうち第2領域は、例えば、第2領域列を形成していてもよい。第2領域列は、例えば、複数のブロック列に跨って、それぞれのブロック列の末尾ブロックの複数の領域のうち第2領域を順に連結した領域列である。第2領域列は、例えば、Block-wise Optional Arraのデータ構造として扱われる。第2領域に対応付けられた、当該第2領域を含むブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアが未設定である場合、当該第2領域の状態を「オプション状態」と表記する場合がある。第2領域に対応付けられた、当該第2領域を含むブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアが設定される場合、当該第2領域の状態を「バリュー状態」と表記する場合がある。それぞれのブロック列の末尾ブロックの複数の領域のうち第2領域は、例えば、第2領域列を形成せずに、互いに独立していてもよい。
【0065】
記憶部400は、第1領域列において、オプション状態の第1領域が存在するか否かを示すフラグ情報を記憶する。フラグ情報は、例えば、値が1であれば、オプション状態の第1領域が存在しないことを示す。フラグ情報は、例えば、値が0であれば、オプション状態の第1領域が存在することを示す。
【0066】
取得部401は、各機能部の処理に用いられる各種情報を取得する。取得部401は、取得した各種情報を、記憶部400に記憶し、または、各機能部に出力する。また、取得部401は、記憶部400に記憶しておいた各種情報を、各機能部に出力してもよい。取得部401は、例えば、利用者の操作入力に基づき、各種情報を取得する。取得部401は、例えば、情報処理装置100とは異なる装置から、各種情報を受信してもよい。
【0067】
取得部401は、複数のブロック列全体の初期化要求を受け付ける。初期化要求は、複数のブロック列全体の指定を含む。取得部401は、例えば、利用者の操作入力に基づき、複数のブロック列全体の初期化要求の入力を受け付ける。取得部401は、例えば、複数のブロック列全体の初期化要求を、他のコンピュータから受信することにより受け付けてもよい。
【0068】
取得部401は、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付ける。初期化要求は、例えば、複数のブロック列のいずれかのブロック列を特定する情報を含む。初期化要求は、具体的には、複数のブロック列のいずれかのブロック列のインデックスを含む。取得部401は、例えば、利用者の操作入力に基づき、複数のブロック列のいずれかのブロック列全体の初期化要求の入力を受け付ける。取得部401は、例えば、複数のブロック列のいずれかのブロック列全体の初期化要求を、他のコンピュータから受信することにより受け付けてもよい。
【0069】
取得部401は、配列のいずれかの成分の値の書き込み要求を受け付ける。書き込み要求は、例えば、配列のいずれかの成分を特定する情報を含む。書き込み要求は、具体的には、配列のいずれかの成分のインデックスを含む。取得部401は、例えば、利用者の操作入力に基づき、配列のいずれかの成分の値の書き込み要求の入力を受け付ける。取得部401は、例えば、配列のいずれかの成分の値の書き込み要求を、他のコンピュータから受信することにより受け付けてもよい。
【0070】
取得部401は、配列のいずれかの成分の値の読み出し要求を受け付ける。読み出し要求は、例えば、配列のいずれかの成分を特定する情報を含む。読み出し要求は、具体的には、配列のいずれかの成分のインデックスを含む。取得部401は、例えば、利用者の操作入力に基づき、配列のいずれかの成分の値の読み出し要求の入力を受け付ける。取得部401は、例えば、配列のいずれかの成分の値の読み出し要求を、他のコンピュータから受信することにより受け付けてもよい。
【0071】
取得部401は、いずれかの機能部の処理を開始する開始トリガーを受け付けてもよい。開始トリガーは、例えば、利用者による所定の操作入力があったことである。開始トリガーは、例えば、他のコンピュータから、所定の情報を受信したことであってもよい。開始トリガーは、例えば、いずれかの機能部が所定の情報を出力したことであってもよい。
【0072】
取得部401は、例えば、複数のブロック列全体の初期化要求を受け付けたことを、変更部の処理を開始する開始トリガーとして受け付けてもよい。取得部401は、例えば、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことを、変更部の処理を開始する開始トリガーとして受け付けてもよい。取得部401は、例えば、配列のいずれかの成分の値の書き込み要求を受け付けたことを、格納部404の処理を開始する開始トリガーとして受け付けてもよい。取得部401は、例えば、配列のいずれかの成分の値の読み出し要求を受け付けたことを、読出部405の処理を開始する開始トリガーとして受け付けてもよい。
【0073】
管理部402は、それぞれのブロック列を管理する。管理部402は、例えば、ブロック列を分割した2つの範囲のうち、前半の範囲に、オプション状態の前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応付けられた成分の値を分配して保持するよう、当該ブロック列を管理する。これにより、管理部402は、ブロック列の前半の範囲に、オプション状態の前方ブロックがある場合には、少なくとも、当該ブロック列の末尾ブロックの一部である複数の領域を、成分の値を格納しない未使用領域にすることができる。ブロック列の前半の範囲に、オプション状態の前方ブロックがない場合には、当該ブロック列の末尾ブロックは、未使用領域を含まない。
【0074】
管理部402は、それぞれのブロック列の末尾ブロックの複数の領域のうち第1領域を連結した第1領域列を管理する。管理部402は、第1領域列を分割した2つの範囲のうち、前半の範囲に、オプション状態の前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配して保持するよう、第1領域列を管理する。これにより、管理部402は、第1領域列の前半の範囲に、オプション状態の前方領域がある場合には、少なくとも、第1領域列の末尾領域の一部の領域を、成分の値を格納しない未使用領域にすることができる。第1領域列の前半の範囲に、オプション状態の前方領域がない場合には、第1領域列の末尾領域は、未使用領域を含まない。
【0075】
管理部402は、第1領域列の前半の範囲に、オプション状態の前方領域がある場合には、第1領域列の末尾領域の一部の領域に、第1領域列を分割する可変の位置を示すポインタと、第1領域列において値が未設定の成分の初期値とを保持する。これにより、管理部402は、第1領域列を初期化し易くすることができる。管理部402は、例えば、第1領域列を初期化する際にかかる処理時間および処理負担を、O(1)に抑制することができる。O(・)は、オーダを示す。
【0076】
管理部402は、それぞれのブロック列の末尾ブロックの複数の領域のうち第2領域を利用して、それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持する。管理部402は、例えば、それぞれのブロック列の末尾ブロックの複数の領域のうち第2領域に、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを格納することにより保持する。これにより、管理部402は、ブロック列を初期化し易くすることができる。管理部402は、例えば、ブロック列を初期化する際にかかる処理時間および処理負担を、O(1)に抑制することができる。
【0077】
管理部402は、それぞれのブロック列の末尾ブロックの第2領域を連結した第2領域列を管理してもよい。管理部402は、第2領域列を分割した2つの範囲のうち、前半の範囲に、オプション状態の前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応するペアを分配して保持するよう、第2領域列を管理する。これにより、管理部402は、第2領域列の前半の範囲に、オプション状態の前方領域がある場合には、少なくとも、第2領域列の末尾領域の一部の領域を、ペアを格納しない未使用領域にすることができる。第2領域列の前半の範囲に、オプション状態の前方領域がない場合には、第2領域列の末尾領域は、ペアを格納しない未使用領域を含まない。
【0078】
管理部402は、第2領域列の前半の範囲に、オプション状態の前方領域がある場合には、第2領域列の末尾領域の一部の領域に、第2領域列を分割する可変の位置を示すポインタと、第2領域列において値が未設定のペアの初期値とを保持する。これにより、管理部402は、第2領域列を初期化し易くすることができる。管理部402は、例えば、第2領域列を初期化する際にかかる処理時間および処理負担を、O(1)に抑制することができる。
【0079】
管理部402は、第2領域列を初期化することにより、それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを、一括して初期化し易くすることができる。このため、管理部402は、複数のブロック列の全体を一括して初期化し易くすることができる。
【0080】
管理部402は、フラグ情報を用いて、それぞれのブロック列の末尾ブロックの一部である第1領域が、オプション状態であるか否かを判定する。管理部402は、いずれかのブロック列の末尾ブロックの一部である第1領域が、オプション状態であると判定した場合、当該ブロック列を、オプション状態のブロックが存在するブロック列として扱う。これにより、管理部402は、ブロック列ごとに、オプション状態のブロックが存在するか否かを示すフラグ情報を用意せずに済ませることができ、複数のブロック列を記憶する際にかかるデータ量の低減化を図ることができる。
【0081】
管理部402は、いずれかのブロック列の末尾ブロックの一部である第1領域が、オプション状態ではないと判定した場合、当該ブロック列を、オプション状態のブロックが存在しないブロック列と扱う。これにより、管理部402は、ブロック列ごとに、オプション状態のブロックが存在するか否かを示すフラグ情報を用意せずに済ませることができ、複数のブロック列を記憶する際にかかるデータ量の低減化を図ることができる。
【0082】
更新部403は、複数のブロック列全体の初期化要求を受け付けたことに応じて、第2領域列を更新する。更新部403は、例えば、第2領域列の末尾の領域の一部の領域に、第2領域列を分割する位置として第2領域列の先頭を示すポインタと、第2領域列において値が未設定のペアの初期値とを格納する。ペアの初期値は、例えば、ブロック列を分割する位置として当該ブロック列の先頭を示すポインタと、ブロック列において値が未設定の成分の初期値とのペアを示す。これにより、更新部403は、第2領域列を初期化することができる。このため、更新部403は、それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを、一括して初期化することができる。更新部403は、複数のブロック列全体を初期化する際にかかる処理時間および処理負担を、O(1)に抑制することができる。
【0083】
更新部403は、複数のブロック列全体の初期化要求を受け付けたことに応じて、第1領域列を更新する。更新部403は、例えば、第1領域列の末尾の領域の一部の領域に、第1領域列を分割する位置として第1領域列の先頭を示すポインタと、第1領域列において値が未設定の成分の初期値とを格納する。これにより、更新部403は、第1領域列を初期化することができる。このため、更新部403は、複数のブロック列全体を初期化したことを、第1領域列に適切に反映することができる。
【0084】
更新部403は、複数のブロック列全体の初期化要求を受け付けたことに応じて、フラグ情報を更新する。更新部403は、例えば、フラグ情報が、第1領域列において、オプション状態の第1領域が存在しないことを示す値であれば、オプション状態の第1領域が存在することを示す値に更新する。更新部403は、複数のブロック列全体の初期化要求を受け付けたことに応じて、フラグ情報が、第1領域列において、オプション状態の第1領域が存在することを示す値であれば、当該フラグ情報を更新しない。これにより、更新部403は、フラグ情報を適切に管理することができ、第1の領域列において、オプション状態の第1領域が存在することを適切に表現することができる。
【0085】
更新部403は、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、第2領域列を更新する。更新部403は、例えば、いずれかのブロック列に存在する第2領域に対応するペアに、当該いずれかのブロック列の先頭を示すポインタと、値が未設定の成分の初期値とのペアを設定するよう、当該いずれかのブロック列に対応する第2領域を更新する。いずれかのブロック列に対応する第2領域は、例えば、いずれかのブロック列に存在する第2領域であってもよい。いずれかのブロック列に対応する第2領域は、例えば、第2領域列の前半の範囲に存在する、オプション状態の前方領域であってもよい。
【0086】
更新部403は、具体的には、いずれかのブロック列に存在する第2領域に対応するペアを、第2領域列の前半の範囲に存在する、オプション状態の前方領域に分配してもよい。更新部403は、具体的には、いずれかのブロック列に存在する第2領域に対応するペアの全部または一部を、第2領域列の前半の範囲に存在する、オプション状態の前方領域に格納して保持する。これにより、更新部403は、いずれかのブロック列を初期化することができる。このため、更新部403は、いずれかのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを初期化することができる。更新部403は、いずれかのブロック列全体を初期化する際にかかる処理時間および処理負担を、O(1)に抑制することができる。
【0087】
更新部403は、いずれかのブロック列全体の初期化要求を受け付けたことに応じて、第1領域列を更新する。更新部403は、例えば、第1領域列のうち、いずれかのブロック列に対応する第1領域が、オプション状態になるよう、第1領域列を更新する。いずれかのブロック列に対応する第1領域は、例えば、いずれかのブロック列に存在する第1領域であってもよい。いずれかのブロック列に対応する第1領域は、例えば、第1領域列の前半の範囲に存在する、オプション状態の前方領域であってもよい。
【0088】
更新部403は、具体的には、いずれかのブロック列に対応する第1領域が、オプション状態になるよう、第1領域列の末尾の領域の一部の領域における、第1領域列を分割する位置を示すポインタと、第1領域列において値が未設定の成分の初期値とを更新する。これにより、更新部403は、いずれかのブロック列を初期化したことを、第1領域列に適切に反映することができる。
【0089】
更新部403は、いずれかのブロック列全体の初期化要求を受け付けたことに応じて、フラグ情報を更新する。更新部403は、例えば、フラグ情報が、第1領域列において、オプション状態の第1領域が存在しないことを示す値であれば、オプション状態の第1領域が存在することを示す値に更新する。更新部403は、複数のブロック列全体の初期化要求を受け付けたことに応じて、フラグ情報が、第1領域列において、オプション状態の第1領域が存在することを示す値であれば、当該フラグ情報を更新しない。これにより、更新部403は、フラグ情報を適切に管理することができ、第1の領域列において、オプション状態の第1領域が存在することを適切に表現することができる。
【0090】
格納部404は、配列のいずれかの成分の値の書き込み要求を受け付けたことに応じて、複数のブロック列のうち、当該いずれかの成分に対応する書き込み先ブロックを特定する。格納部404は、特定した書き込み先ブロックが、オプション状態のブロックであるか否かを判定する。格納部404は、特定した書き込み先ブロックが、オプション状態のブロックではない場合、いずれかの成分の値を、特定した書き込み先ブロックに書き込む。これにより、格納部404は、書き込み要求を適切に処理し、いずれかの成分の値を適切に格納しておくことができる。
【0091】
格納部404は、特定した書き込み先ブロックが、オプション状態のブロックである場合、特定した書き込み先ブロックに対応する所定数の成分のうち、いずれかの成分の値と、いずれかの成分とは異なる残余の成分の初期値とを、書き込み先ブロックに書き込む。格納部404は、特定した書き込み先ブロックが、バリュー状態になるよう、第2領域列を更新することにより、書き込み先ブロックを含むブロック列を分割する位置を示すポインタを更新してもよい。これにより、格納部404は、書き込み要求を適切に処理し、いずれかの成分の値を適切に格納しておくことができる。
【0092】
読出部405は、配列のいずれかの成分の値の読み出し要求を受け付けたことに応じて、複数のブロック列のうち、当該いずれかの成分に対応する読み出し元ブロックを特定する。読出部405は、特定した読み出し元ブロックが、オプション状態のブロックであるか否かを判定する。読出部405は、特定した読み出し元ブロックが、オプション状態のブロックではない場合、特定した読み出し元ブロックから、いずれかの成分の値を読み出す。これにより、読出部405は、読み出し要求を適切に処理し、いずれかの成分の値を適切に読み出すことができる。
【0093】
読出部405は、特定した読み出し元ブロックが、オプション状態のブロックである場合、特定した読み出し元ブロックに対応する第2領域が、オプション状態の第2領域であるか否かを判定する。読出部405は、オプション状態の第2領域であれば、第2領域列の末尾の領域の一部の領域から、いずれかの成分の初期値を読み出す。これにより、読出部405は、読み出し要求を適切に処理し、いずれかの成分の値を適切に読み出すことができる。
【0094】
読出部405は、特定した読み出し元ブロックに対応する第2領域が、オプション状態の第2領域でなければ、特定した読み出し元ブロックに対応する第2領域から、いずれかの成分の初期値を読み出す。これにより、読出部405は、読み出し要求を適切に処理し、いずれかの成分の値を適切に読み出すことができる。
【0095】
出力部406は、少なくともいずれかの機能部の処理結果を出力する。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、ネットワークI/F303による外部装置への送信、または、メモリ302や記録媒体305などの記憶領域への記憶である。これにより、出力部406は、少なくともいずれかの機能部の処理結果を利用者に通知可能にし、情報処理装置100の利便性の向上を図ることができる。
【0096】
出力部406は、複数のブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列全体を初期化することに成功したことを出力する。出力部406は、例えば、複数のブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列全体を初期化することに成功したことを、利用者が参照可能に出力する。これにより、出力部406は、複数のブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列全体を初期化することに成功したことを参照可能にすることができる。
【0097】
出力部406は、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列のいずれかのブロック列全体を初期化することに成功したことを出力する。出力部406は、例えば、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列のいずれかのブロック列全体を初期化することに成功したことを、利用者が参照可能に出力する。これにより、出力部406は、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、複数のブロック列のいずれかのブロック列全体を初期化することに成功したことを参照可能にすることができる。
【0098】
出力部406は、書き込み要求に応じて配列のいずれかの成分の値を書き込むことに成功したことを出力する。出力部406は、例えば、書き込み要求に応じて配列のいずれかの成分の値を書き込むことに成功したことを、利用者が参照可能に出力する。これにより、出力部406は、書き込み要求に応じて配列のいずれかの成分の値を書き込むことに成功したことを参照可能にすることができる。
【0099】
出力部406は、読み出し要求に応じて読み出した配列のいずれかの成分の値を出力する。出力部406は、例えば、読み出し要求に応じて読み出した配列のいずれかの成分の値を、利用者が参照可能に出力する。これにより、出力部406は、配列のいずれかの成分の値を利用可能にすることができる。
【0100】
(情報処理装置100の動作例)
次に、図5図7を用いて、情報処理装置100の動作例について説明する。例えば、まず、図5を用いて、情報処理装置100が記憶するブロック列500のデータ構造の一例について説明する。ブロック列500のデータ構造は、例えば、Optimal Space Initializable Arrayと呼ばれるデータ構造である。
【0101】
図5は、ブロック列500のデータ構造の一例を示す説明図である。図5に示すように、ブロック列500は、例えば、それぞれ配列の所定数の成分に対応付けられた複数のブロック510を連結して形成される。ブロック列500は、例えば、配列を表現する。
【0102】
ブロック列500は、例えば、前後2つの範囲に分割される。ブロック列500を分割する位置は、例えば、スタックポインタ520によって示される。ブロック列500を分割する位置は、例えば、可変である。以下の説明では、ブロック列500を分割した2つの範囲のうち、前半の範囲を「M(Mild)領域」と表記する場合がある。以下の説明では、ブロック列500を分割した2つの範囲のうち、後半の範囲を「W(Wild)領域」と表記する場合がある。
【0103】
ブロック510は、所定数の領域を含む。領域は、例えば、成分の値を格納可能である。領域は、例えば、いずれかのブロック510へのポインタを格納可能であってもよい。ブロック510は、例えば、バリュー状態と、オプション状態とのいずれかの状態を取る。ブロック510は、具体的には、当該ブロック510に対応付けられた所定数の成分の値がすべて未設定であれば、オプション状態である。例えば、オプション状態のブロック510に対応付けられた所定数の成分の値は、設定された初期値として扱われる。ブロック510は、具体的には、当該ブロック510に対応付けられた少なくともいずれかの成分の値が設定されれば、バリュー状態である。
【0104】
M領域のバリュー状態のブロック511は、例えば、当該ブロック511に対応付けられた少なくともいずれかの成分の値vを、そのまま格納する。M領域のバリュー状態のブロック511は、例えば、当該ブロック511に対応付けられた所定数の成分のうち、値が未設定の成分の値に関しては、設定された初期値を格納する。図5の例では、M領域のバリュー状態のブロック511は、具体的には、当該ブロック511に対応付けられた所定数の成分のそれぞれの成分の値を、当該ブロック511の所定数の領域のそれぞれの領域に格納する。
【0105】
M領域のオプション状態のブロック512は、例えば、W領域のバリュー状態のブロック513に対応付けられた所定数の成分のうち、先頭から所定数-1の成分の値を分配する分配先となる。M領域のオプション状態のブロック512は、例えば、当該ブロック512の所定数の領域のうち先頭の領域に、所定数-1の成分の値を分配する分配元となるW領域のバリュー状態のブロック513へのポインタを格納する。M領域のオプション状態のブロック512は、例えば、上述した所定数-1の成分のそれぞれの成分の値を、当該ブロック512の所定数の領域のうち先頭の領域以外の残余の領域に格納する。
【0106】
W領域のバリュー状態のブロック513は、例えば、当該ブロック513に対応付けられた所定数の成分のうち、先頭から所定数-1の成分の値を、M領域のオプション状態のブロック512へと分配する分配元となる。W領域のバリュー状態のブロック513は、例えば、当該ブロック513の所定数の領域のうち先頭の領域に、所定数-1の成分の値を分配する分配先となるM領域のオプション状態のブロック512へのポインタを格納する。W領域のバリュー状態のブロック513は、例えば、当該ブロック513に対応付けられた所定数の成分のうち、末尾の成分の値を、当該ブロック513の所定数の領域のうち先頭から2番目の領域に格納する。
【0107】
W領域のオプション状態のブロック514は、例えば、成分の値が格納されない。W領域のオプション状態のブロック514は、具体的には、いずれのブロック510へのポインタともならない任意の値を、当該ブロック514の所定数の領域のうち先頭の領域に格納する。W領域のオプション状態のブロック514は、具体的には、任意の値を、当該ブロック514の所定数の領域のうち先頭の領域以外の残余の領域に格納する。
【0108】
配列の成分の値が設定される都度、ブロック列500が更新される。例えば、配列の成分の値が設定されたことに応じて、ブロック列500に関するスタックポインタ520が示す位置が更新され、M領域と、W領域とが更新されることがある。例えば、配列の成分の値が設定されたことに応じて、ブロック510の状態が、バリュー状態、または、オプション状態に更新されることがある。
【0109】
配列のすべての成分の値が設定される直前までは、ブロック列500のうち末尾のブロック510は、W領域のバリュー状態、または、W領域のオプション状態のいずれかの状態になる。このため、配列のすべての成分の値が設定される直前までは、ブロック列500のうち末尾のブロック510の所定数の領域のうち、先頭から2つの領域を除いた、所定数-2個の領域は、成分の値を格納されない領域になる。配列のすべての成分の値が設定される直前までは、ブロック列500のうち末尾のブロック510の所定数の領域のうち、先頭から2つの領域は、他のブロック510へのポインタ、および、1つの成分の値を格納され得る。
【0110】
ブロック列500に関するスタックポインタ520は、例えば、配列のすべての成分の値が設定される直前までは、ブロック列500のうち末尾のブロック510の所定数の領域のうち、先頭から2つの領域を除いた、所定数-2個の領域に格納される。オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値は、例えば、配列のすべての成分の値が設定される直前までは、ブロック列500のうち末尾のブロック510の所定数の領域のうち、上述した所定数-2個の領域に格納される。
【0111】
情報処理装置100は、例えば、それぞれ異なる配列を表す複数のブロック列500を記憶することにより、複数の配列を記憶する。次に、図6を用いて、情報処理装置100が、複数のブロック列500を記憶する第1の例について説明する。
【0112】
図6は、複数のブロック列500を記憶する第1の例を示す説明図である。ここで、配列のすべての成分の値が設定された場合には、ブロック列500のうち末尾のブロック510の所定数の領域のうち、成分の値を格納されない領域は、存在しなくなる。換言すれば、配列のすべての成分の値が設定された場合には、ブロック列500のうち末尾のブロック510の所定数の領域は、すべて成分の値を格納する。
【0113】
従って、配列のすべての成分の値が設定された場合には、ブロック列500のうち末尾のブロック510に、ブロック列500に関するスタックポインタ520を格納することができなくなる。この場合、W領域は、存在しなくなる。
【0114】
これに対し、ブロック列500ごとに、配列のすべての成分の値が設定され、当該ブロック列500がフル状態になったか否かを示すフラグ情報601を対応付けて用意する手法が考えられる。フラグ情報601は、例えば、値が1であれば、オプション状態のブロック510が存在せず、ブロック列500が、フル状態であることを示す。フラグ情報601は、例えば、値が0であれば、オプション状態のブロック510が存在し、ブロック列500が、ノットフル状態であることを示す。
【0115】
この手法では、例えば、ブロック列500ごとに、当該ブロック列500に対応付けられたフラグ情報601によって、当該ブロック列500の末尾のブロック510に、ブロック列500に関するスタックポインタ520が存在するか否かを判定可能にする。しかしながら、この手法では、それぞれ異なる配列を表す複数のブロック列500を記憶する際にかかるデータ量の増大化を招くという問題がある。この手法では、具体的には、配列の数が多く、情報処理装置100が記憶するブロック列500の数が多くなるほど、用意するフラグ情報601の数の増大化を招き、データ量の増大化を招くことになる。
【0116】
情報処理装置100は、それぞれのブロック列500の末尾のブロック510に存在する、成分の値を格納されない所定数-2個未満の末尾領域611を、末尾領域611を連結した末尾領域列620として管理する。末尾領域611は、例えば、末尾のブロック510の所定数の領域のうち、ブロック列500に関するスタックポインタ520を格納する領域を含まない。末尾領域611は、例えば、末尾のブロック510の所定数の領域のうち、スタックポインタ520を格納する領域を含んでいてもよい。
【0117】
末尾領域611は、例えば、末尾のブロック510の所定数の領域のうち、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納する領域を含まない。末尾領域611は、例えば、末尾のブロック510の所定数の領域のうち、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納する領域を含んでいてもよい。
【0118】
末尾領域611は、例えば、所定数-2個未満の領域を含む。領域は、例えば、成分の値を格納可能である。領域は、例えば、いずれかの末尾領域611へのポインタを格納可能であってもよい。以下の説明では、末尾領域611は、具体的には、ブロック列500に関するスタックポインタ520を格納する領域と、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納する領域とを含まないとする。従って、以下の説明では、末尾領域611は、具体的には、所定数-4個の領域である。情報処理装置100は、具体的には、末尾領域列620を、Optimal Space Initializable Arrayと呼ばれるデータ構造として管理する。
【0119】
末尾領域列620は、ブロック列500と同様に、例えば、前後2つの範囲に分割される。末尾領域列620を分割する位置は、例えば、スタックポインタによって示される。末尾領域列620を分割する位置は、例えば、可変である。以下の説明では、ブロック列500と同様に、末尾領域列620を分割した2つの範囲のうち、前半の範囲を「M(Mild)領域」と表記する場合がある。以下の説明では、ブロック列500と同様に、末尾領域列620を分割した2つの範囲のうち、後半の範囲を「W(Wild)領域」と表記する場合がある。
【0120】
末尾領域611は、例えば、バリュー状態と、オプション状態とのいずれかの状態を取る。末尾領域611は、具体的には、当該末尾領域611に対応付けられた成分の値がいずれも格納されていなければ、オプション状態になる。換言すれば、末尾領域611は、当該末尾領域611を含むブロック列500が、ノットフル状態である場合に、オプション状態になる。例えば、オプション状態の末尾領域611に対応付けられた所定数の成分の値は、末尾領域611に対して設定された初期値として扱われてもよい。
【0121】
末尾領域611は、具体的には、当該末尾領域611に対応付けられた少なくともいずれかの成分の値が格納されていれば、バリュー状態になる。換言すれば、末尾領域611は、当該末尾領域611を含むブロック列500が、フル状態である場合に、バリュー状態になる。このように、末尾領域611の状態は、当該末尾領域611を含むブロック列500が、フル状態であるか、または、ノットフル状態であるかを示す情報として利用可能である。
【0122】
M領域のバリュー状態の末尾領域611は、例えば、当該末尾領域611に対応付けられた少なくともいずれかの成分の値vを、そのまま格納する。M領域のバリュー状態の末尾領域611は、例えば、当該末尾領域611に対応付けられた成分のうち、値が未設定の成分の値に関しては、設定された初期値を格納する。
【0123】
M領域のオプション状態の末尾領域611は、例えば、W領域のバリュー状態の末尾領域611に対応付けられた成分の値を分配する分配先となる。M領域のオプション状態の末尾領域611は、例えば、当該末尾領域611の所定数-4個の領域のうち先頭の領域に、成分の値を分配する分配元となるW領域のバリュー状態の末尾領域611へのポインタを格納する。M領域のオプション状態の末尾領域611は、例えば、上述した成分の値を、当該末尾領域611の所定数-4個の領域のうち先頭の領域以外の残余の領域に格納する。
【0124】
W領域のバリュー状態の末尾領域611は、例えば、当該末尾領域611に対応付けられた成分の値を、M領域のオプション状態の末尾領域611へと分配する分配元となる。W領域のバリュー状態の末尾領域611は、例えば、当該末尾領域611の所定数-4個の領域のうち先頭の領域に、成分の値を分配する分配先となるM領域のオプション状態の末尾領域611へのポインタを格納する。W領域のバリュー状態の末尾領域611は、例えば、当該末尾領域611に対応付けられた成分のうち、末尾の成分の値を、当該末尾領域611の所定数-4個の領域のうち先頭から2番目の領域に格納する。
【0125】
W領域のオプション状態の末尾領域611は、例えば、成分の値が格納されない。W領域のオプション状態の末尾領域611は、具体的には、いずれの末尾領域611へのポインタともならない任意の値を、当該末尾領域611の所定数-4個の領域のうち先頭の領域に格納する。W領域のオプション状態の末尾領域611は、具体的には、任意の値を、当該末尾領域611の所定数-4個の領域のうち先頭の領域以外の残余の領域に格納する。
【0126】
いずれかのブロック列500の末尾のブロック510に対応付けられた成分の値が設定される都度、末尾領域列620が更新される。例えば、成分の値が設定されたことに応じて、末尾領域列620に関するスタックポインタが示す位置が更新され、M領域と、W領域とが更新されることがある。例えば、成分の値が設定されたことに応じて、末尾領域611の状態が、バリュー状態、または、オプション状態に更新されることがある。
【0127】
末尾領域列620に対応付けられたすべての成分の値が設定される直前までは、末尾領域列620のうち末尾に存在する末尾領域611は、W領域のバリュー状態、または、W領域のオプション状態のいずれかの状態になる。このため、末尾領域列620に対応付けられたすべての成分の値が設定される直前までは、末尾領域列620のうち末尾に存在する末尾領域611のうち、先頭から2つの領域を除いた残余の領域は、成分の値を設定されない領域になる。
【0128】
末尾領域列620に関するスタックポインタは、例えば、末尾領域列620に対応付けられたすべての成分の値が設定される直前までは、末尾領域列620のうち末尾に存在する末尾領域611のうち、上述した残余の領域に格納される。オプション状態の末尾領域611に対応付けられた成分の値に対する初期値は、例えば、末尾領域列620に対応付けられたすべての成分の値が設定される直前までは、末尾領域列620のうち、上述した残余の領域に格納される。
【0129】
ここで、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、複数のブロック列500において、成分の値を設定されない領域は、存在しなくなる。換言すれば、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、末尾領域列620において、オプション状態の末尾領域611は、存在しなくなる。このため、末尾領域列620のうち末尾に存在する末尾領域611は、成分の値を格納されない領域を有さなくなる。従って、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、末尾領域列620のうち末尾に存在する末尾領域611に、末尾領域列620に関するスタックポインタを格納することができなくなる。この場合、W領域は、存在しなくなる。
【0130】
そこで、情報処理装置100は、末尾領域列620がオプション状態の末尾領域611を含まなくなり、当該末尾領域列620がフル状態になったか否かを示すフラグ情報630を記憶する。フラグ情報630は、例えば、値が1であれば、オプション状態の末尾領域611が存在せず、末尾領域列620が、フル状態であることを示す。フラグ情報630は、例えば、値が0であれば、オプション状態の末尾領域611が存在し、末尾領域列620が、ノットフル状態であることを示す。
【0131】
これにより、情報処理装置100は、ブロック列500ごとに、フラグ情報601を対応付けて用意しなくても、末尾領域611の状態に応じて、当該末尾領域611を含むブロック列500が、フル状態であるか否かを管理することができる。また、情報処理装置100は、フラグ情報630に基づいて、末尾領域列620が、フル状態であるか否かを管理することができる。
【0132】
従って、情報処理装置100は、上述したブロック列500ごとに、フラグ情報601を対応付けて用意する手法に比べて、複数のブロック列500を記憶する際にかかるデータ量の低減化を図ることができる。例えば、上述したブロック列500ごとに、フラグ情報601を対応付けて用意する手法では、複数のブロック列500を記憶する際にかかるデータ量は、O(M)になる。Mは、ブロック列の数(=配列の数)である。これに対し、情報処理装置100は、複数のブロック列500を記憶する際にかかるデータ量を、O(1)に抑制することができる。
【0133】
上述した第1の例では、情報処理装置100は、複数のブロック列500の全体を初期化する際、ブロック列500ごとに、当該ブロック列500の末尾のブロック510に存在する、スタックポインタ520と、初期値600とのペアを更新することになる。このため、複数のブロック列500の全体を初期化する際にかかる処理負担および処理時間は、O(M)になると考えられる。
【0134】
これに対し、情報処理装置100が、複数のブロック列500の全体を初期化する際にかかる処理負担および処理時間を、O(1)に抑制するよう、複数のブロック列500を記憶する第2の例について説明する。具体的には、図7を用いて、情報処理装置100が、複数のブロック列500を記憶する第2の例について説明する。
【0135】
図7は、複数のブロック列500を記憶する第2の例を示す説明図である。情報処理装置100は、それぞれのブロック列500の末尾のブロック510に存在する、成分の値を格納されない所定数-2個の末尾領域を、第1領域711と、第2領域712とに区分する。
【0136】
第1領域711は、例えば、末尾のブロック510の所定数の領域のうち、ブロック列500に関するスタックポインタ520を格納する領域を含まない。第1領域711は、例えば、末尾のブロック510の所定数の領域のうち、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納する領域を含まない。第2領域712は、少なくとも2つの領域を含む。
【0137】
情報処理装置100は、それぞれのブロック列500の末尾のブロック510に存在する第1領域711を、第1領域711を連結した第1領域列710として管理する。第1領域列710は、末尾領域列620と同様である。情報処理装置100は、具体的には、第1領域列710を、Optimal Space Initializable Arrayと呼ばれるデータ構造として管理する。
【0138】
一方で、情報処理装置100は、それぞれのブロック列500の末尾のブロック510に存在する第2領域721を、第2領域721を連結した第2領域列720として管理する。情報処理装置100は、具体的には、第2領域列720を、Optimal Space Initializable Arrayと呼ばれるデータ構造として管理する。
【0139】
第2領域721は、例えば、末尾のブロック510の所定数の領域のうち、スタックポインタ520を格納する領域を含む。第2領域721は、例えば、末尾のブロック510の所定数の領域のうち、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納する領域を含む。
【0140】
以下の説明では、第2領域721は、具体的には、4個の領域であるとする。領域は、例えば、ブロック列500に関するスタックポインタ520を格納可能である。領域は、例えば、オプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値600を格納可能である。領域は、例えば、成分の値を格納可能である。
【0141】
第2領域列720は、ブロック列500と同様に、例えば、前後2つの範囲に分割される。第2領域列720を分割する位置は、例えば、スタックポインタによって示される。第2領域列720を分割する位置は、例えば、可変である。以下の説明では、ブロック列500と同様に、第2領域列720を分割した2つの範囲のうち、前半の範囲を「M(Mild)領域」と表記する場合がある。以下の説明では、ブロック列500と同様に、第2領域列720を分割した2つの範囲のうち、後半の範囲を「W(Wild)領域」と表記する場合がある。
【0142】
第2領域721は、例えば、バリュー状態と、オプション状態とのいずれかの状態を取る。第2領域721は、具体的には、当該第2領域721に対応付けられた成分の値が格納されておらず、かつ、スタックポインタ520と、初期値600とのペアが格納されていなければ、オプション状態になる。第2領域721は、例えば、当該第2領域721を含むブロック列500が、初期状態である場合に、オプション状態になる。第2領域721が、オプション状態である場合、当該第2領域721を含むブロック列500に関するスタックポインタと、初期値600とのペアは、設定された初期ペアとして扱われる。
【0143】
第2領域721は、具体的には、当該第2領域721に対応付けられた成分の値が格納されていれば、バリュー状態になる。換言すれば、第2領域721は、当該第2領域721を含むブロック列500が、フル状態である場合に、バリュー状態になる。ブロック列500が、フル状態である場合、当該ブロック列の第1領域711は、バリュー状態である。従って、第2領域721を含むブロック列500の第1領域711が、バリュー状態である場合に、当該第2領域721も、バリュー状態であれば、当該第2領域721は、当該第2領域721に対応付けられた成分の値を格納していると扱われる。
【0144】
一方で、第2領域721は、具体的には、スタックポインタ520と、初期値600とのペアが格納されていても、バリュー状態になる。換言すれば、第2領域721は、当該第2領域721を含むブロック列500が、ノットフル状態である場合に、バリュー状態になる。ブロック列500が、ノットフル状態である場合、当該ブロック列の第1領域711は、オプション状態である。従って、第2領域721を含むブロック列500の第1領域711が、オプション状態である場合に、当該第2領域721が、バリュー状態であれば、当該第2領域721は、スタックポインタ520と、初期値600とのペアを格納していると扱われる。
【0145】
このように、第1領域711の状態と、第2領域721の状態との組み合わせは、当該第2領域721が、空であるか、成分の値を格納しているか、または、スタックポインタ520と、初期値600とのペアを格納しているかを示すことになる。
【0146】
M領域のバリュー状態の第2領域721は、例えば、当該第2領域721に対応付けられた少なくともいずれかの成分の値vを、そのまま格納する場合がある。この場合、M領域のバリュー状態の第2領域721は、例えば、当該第2領域721に対応付けられた成分のうち、値が未設定の成分の値に関しては、設定された初期値を格納する。また、M領域のバリュー状態の第2領域721は、例えば、スタックポインタ520と、初期値600とのペアを格納する場合もある。
【0147】
M領域のオプション状態の第2領域721は、例えば、W領域のバリュー状態の第2領域721に対応付けられた成分の値を分配する分配先となる場合がある。この場合、M領域のオプション状態の第2領域721は、例えば、当該第2領域721のうち先頭の領域に、分配元となるW領域のバリュー状態の第2領域721へのポインタを格納する。この場合、M領域のオプション状態の第2領域721は、例えば、上述した成分の値を、当該第2領域721のうち先頭の領域以外の残余の領域に格納する。
【0148】
また、M領域のオプション状態の第2領域721は、例えば、W領域のバリュー状態の第2領域721を含むブロック列500に関するスタックポインタ520と、初期値600とのペアを分配する分配先となる場合もある。この場合、M領域のオプション状態の第2領域721は、例えば、当該第2領域721のうち先頭の領域に、分配元となるW領域のバリュー状態の第2領域721へのポインタを格納する。この場合、M領域のオプション状態の第2領域721は、例えば、上述したスタックポインタ520と、初期値600とのペアを、当該第2領域721のうち先頭の領域以外の残余の領域に格納する。
【0149】
W領域のバリュー状態の第2領域721は、例えば、当該第2領域721に対応付けられた成分の値を、M領域のオプション状態の第2領域721へと分配する分配元となる場合がある。この場合、W領域のバリュー状態の第2領域721は、例えば、当該第2領域721のうち先頭の領域に、成分の値を分配する分配先となるM領域のオプション状態の第2領域721へのポインタを格納する。この場合、W領域のバリュー状態の第2領域721は、例えば、当該第2領域721に対応付けられた成分のうち、末尾の成分の値を、当該第2領域721のうち先頭から2番目の領域に格納する。
【0150】
W領域のバリュー状態の第2領域721は、例えば、当該第2領域721を含むブロック列500に関するスタックポインタ520と、初期値600とのペアを、M領域のオプション状態の第2領域721へと分配する分配元となる場合がある。この場合、W領域のバリュー状態の第2領域721は、例えば、当該第2領域721のうち先頭の領域に、分配先となるM領域のオプション状態の第2領域721へのポインタを格納する。この場合、W領域のバリュー状態の第2領域721は、例えば、当該第2領域721のうち先頭の領域以外の残余の領域を、空にしていてもよい。
【0151】
W領域のオプション状態の第2領域721は、例えば、成分の値が格納されない。W領域のオプション状態の第2領域721は、例えば、当該第2領域721を含むブロック列500に関するスタックポインタ520と、初期値600とのペアが格納されない。W領域のオプション状態の第2領域721は、具体的には、いずれの第2領域721へのポインタともならない任意の値を、当該第2領域721のうち先頭の領域に格納する。W領域のオプション状態の第2領域721は、具体的には、任意の値を、当該第2領域721のうち先頭の領域以外の残余の領域に格納する。
【0152】
いずれかのブロック列500の末尾のブロック510に対応付けられた成分の値が設定される都度、第2領域列720が更新される。例えば、成分の値が設定されたことに応じて、第2領域列720に関するスタックポインタが示す位置が更新され、M領域と、W領域とが更新されることがある。例えば、成分の値が設定されたことに応じて、第2領域721の状態が、バリュー状態、または、オプション状態に更新されることがある。
【0153】
いずれかのブロック列500に関するスタックポインタ520と、初期値600とのペアが設定または更新される都度、第2領域列720が更新される。例えば、スタックポインタ520と、初期値600とのペアが設定されたことに応じて、第2領域列720に関するスタックポインタが示す位置が更新され、M領域と、W領域とが更新されることがある。例えば、スタックポインタ520と、初期値600とのペアが設定されたことに応じて、第2領域721の状態が、バリュー状態、または、オプション状態に更新されることがある。
【0154】
すべての第2領域721が、M領域のバリュー状態になる直前までは、第2領域列720のうち末尾に存在する第2領域721は、W領域のバリュー状態、または、W領域のオプション状態のいずれかの状態になる。このため、すべての第2領域721が、M領域のバリュー状態になる直前までは、第2領域列720のうち末尾に存在する第2領域721のうち、先頭から2つの領域を除いた残余の領域は、空き領域になる。
【0155】
第2領域列720に関するスタックポインタは、例えば、すべての第2領域721が、M領域のバリュー状態になる直前までは、第2領域列720のうち末尾に存在する第2領域721のうち、上述した残余の領域に格納される。ブロック列500に関するスタックポインタ520と、初期値600とのペアに対する初期ペアは、例えば、すべての第2領域721が、M領域のバリュー状態になる直前までは、末尾に存在する第2領域721のうち、上述した残余の領域に格納される。
【0156】
ここで、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、複数のブロック列500において、成分の値を設定されない領域は、存在しなくなる。換言すれば、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、第1領域列710において、オプション状態の末尾領域611は、存在しなくなる。このため、第1領域列710のうち末尾に存在する第1領域711は、成分の値を格納されない領域を有さなくなる。従って、それぞれのブロック列500が示す配列のすべての成分の値が設定された場合には、第1領域列710のうち末尾に存在する第1領域711に、第1領域列710に関するスタックポインタを格納することができなくなる。この場合、W領域は、存在しなくなる。
【0157】
そこで、情報処理装置100は、第1領域列710がオプション状態の末尾領域611を含まなくなり、当該第1領域列710がフル状態になったか否かを示すフラグ情報730を記憶する。フラグ情報730は、例えば、値が1であれば、オプション状態の第1領域711が存在せず、第1領域列710が、フル状態であることを示す。フラグ情報730は、例えば、値が0であれば、オプション状態の第1領域711が存在し、第1領域列710が、ノットフル状態であることを示す。
【0158】
これにより、情報処理装置100は、ブロック列500ごとに、フラグ情報601を対応付けて用意しなくても、第1領域711の状態に応じて、当該第1領域711を含むブロック列500が、フル状態であるか否かを管理することができる。また、情報処理装置100は、フラグ情報730に基づいて、第1領域列710が、フル状態であるか否かを管理することができる。
【0159】
従って、情報処理装置100は、上述したブロック列500ごとに、フラグ情報601を対応付けて用意する手法に比べて、複数のブロック列500を記憶する際にかかるデータ量の低減化を図ることができる。例えば、上述したブロック列500ごとに、フラグ情報601を対応付けて用意する手法では、複数のブロック列500を記憶する際にかかるデータ量は、O(M)になる。Mは、ブロック列の数(=配列の数)である。これに対し、情報処理装置100は、複数のブロック列500を記憶する際にかかるデータ量を、O(1)に抑制することができる。
【0160】
また、情報処理装置100は、ブロック列500の第2領域721が、バリュー状態である場合には、当該ブロック列500の第1領域711の状態に応じて、当該第2領域721が、何の情報を格納しているかを管理することができる。情報処理装置100は、例えば、第2領域721が、バリュー状態である場合に、第1領域711が、オプション状態であれば、当該第2領域721が、スタックポインタ520と、初期値600とのペアを格納していると判定することができる。一方で、情報処理装置100は、例えば、第2領域721が、バリュー状態である場合に、第1領域711が、バリュー状態であれば、当該第2領域721が、成分の値を格納していると判定することができる。
【0161】
情報処理装置100は、例えば、オプション状態のいずれかの第2領域721が、実際には符号741の内容であれば、当該いずれかの第2領域721が、符号742の内容を示すと認識する。情報処理装置100は、具体的には、いずれかの第2領域721が、オプション状態であれば、当該いずれかの第2領域721は、末尾に存在する第2領域721に格納済みの初期ペアを示すと認識する。初期ペアは、ブロック列500の先頭を示すスタックポインタ=0と、当該ブロック列500のオプション状態のブロック510に対応付けられた所定数の成分の値に対する初期値iv0との組み合わせである。
【0162】
例えば、第1領域711が、オプション状態であるため、当該第1領域711を含むブロック列500が、ノットフル状態であり、当該ブロック列500のいずれかの第2領域721が、バリュー状態である場合が考えられる。ここでは、いずれかの第2領域721は、具体的には、末尾に存在する第2領域721であるとする。この場合、情報処理装置100は、例えば、いずれかの第2領域721が、実際には符号751の内容であれば、当該いずれかの第2領域721が、符号752の内容を示すと認識する。情報処理装置100は、具体的には、いずれかの第2領域721は、当該いずれかの第2領域721の最初の領域に格納済みのポインタpが示す他の第2領域721に格納済みである、スタックポインタspと、初期値ivとの組み合わせを示すと認識する。
【0163】
例えば、第1領域711が、バリュー状態であるため、当該第1領域711を含むブロック列500が、フル状態であり、当該ブロック列500のいずれかの第2領域721が、バリュー状態である場合が考えられる。この場合、情報処理装置100は、例えば、いずれかの第2領域721が、実際には符号761の内容であれば、当該いずれかの第2領域721が、符号762の内容を示すと認識する。符号762の内容は、符号761の内容と同一である。情報処理装置100は、例えば、いずれかの第2領域721が、符号761の内容そのものであると認識する。
【0164】
また、情報処理装置100は、第2領域列720を初期化することにより、それぞれのブロック列500に関するスタックポインタ520と、初期値600とのペアを、一括して、初期ペアに更新することができる。情報処理装置100は、例えば、第2領域列720の末尾に存在する第2領域721において、第2領域列720に関するスタックポインタと、初期ペアとを初期化することにより、第2領域列720を初期化することができる。このため、情報処理装置100は、複数のブロック列500の全体を初期化する際にかかる処理負担および処理時間を、O(1)に抑制することができる。
【0165】
(情報処理装置100の適用例)
次に、図8図17を用いて、情報処理装置100の適用例について説明する。
【0166】
図8図17は、情報処理装置100の適用例を示す説明図である。図8において、情報処理装置100を、表810に示す、M個のユーザRiが共通して製造するN個の商品Cjの取引希望価格を管理する用途に適用する場合について説明する。iは、例えば、0~M-1である。jは、例えば、0~N-1である。図8の例では、M=4であり、N=400であるとする。ユーザRiは、例えば、ユーザAとユーザBとユーザCとなどを含む。ユーザRiは、例えば、クライアント装置202を有する。ユーザRiは、例えば、製造者、または、ベンダなどである。
【0167】
情報処理装置100は、ユーザRiごとに、N個の商品Cjそれぞれの取引希望価格を成分として含む配列を、ブロック列として記憶する。情報処理装置100は、具体的には、それぞれ異なるユーザRiに関し、N個の商品Cjそれぞれの取引希望価格を成分として含むそれぞれ異なる配列を示す、4個のブロック列を記憶する。ブロックは、例えば、100個の成分を格納可能な領域を含むとする。ブロック列は、例えば、4つのブロックを含む。
【0168】
ここで、情報処理装置100は、第1の時点において、クエリキュー800に示す各種クエリを順に受け付けたとする。情報処理装置100は、例えば、クライアント装置202を介して、ユーザRiからのクエリを受け付ける。情報処理装置100は、例えば、不図示の入力装置を介したクエリの入力を受け付けることにより、クエリを受け付けてもよい。
【0169】
クエリは、例えば、複数のブロック列の全体を初期化することを要求する全体初期化要求(initall)である。クエリは、例えば、いずれかのブロック列を初期化することを要求する行初期化要求(init)である。クエリは、例えば、いずれかのブロック列に、いずれかの成分の値を格納することを要求する書き込み要求(write)である。クエリは、例えば、いずれかのブロック列から、いずれかの成分の値を読み出すことを要求する読み出し要求(read)である。以下の説明では、情報処理装置100が、クエリキュー800に示す各種クエリを順に処理する具体例について説明する。
【0170】
まず、図9の説明に移行し、情報処理装置100が、上述した第2の例と同様のデータ構造で、4個のブロック列900を記憶する場合について、第1の時点における4個のブロック列900の状態について説明する。図9に示すように、情報処理装置100は、4個のブロック列900を記憶する。ブロック901は、例えば、100個の成分に対応付けられる。ブロック901は、100個の成分の値を格納可能な領域を含むとする。
【0171】
ブロック列900の末尾のブロック901は、第1領域911と、第2領域921とを含む。情報処理装置100は、それぞれのブロック列900の末尾のブロック901の第1領域911を、当該第1領域911を連結した第1領域列910の一部として扱う。情報処理装置100は、それぞれのブロック列900の末尾のブロック901の第2領域921を、当該第2領域921を連結した第2領域列920の一部として扱う。
【0172】
情報処理装置100は、第1領域列910に、オプション状態の第1領域911が存在するか否か、第1領域列910が、ノットフル状態であるか否かを示すフラグ情報930を記憶する。フラグ情報930は、0または1の値である。フラグ情報930は、値が0であれば、第1領域列910が、ノットフル状態であることを示す。フラグ情報930は、値が1であれば、第1領域列910が、ノットフル状態ではなくフル状態であることを示す。次に、図10の説明に移行する。
【0173】
図10において、情報処理装置100は、クエリキュー800の全体初期化要求「S initall 0」を取り出して処理する。この場合、情報処理装置100は、第1領域列910の末尾に存在する第1領域911に、第1領域列910に関するスタックポインタ=0と、初期値とのペアを格納することにより、第1領域列910全体を初期化する。
【0174】
情報処理装置100は、第2領域列920の末尾に存在する第2領域921に、第2領域列920に関するスタックポインタ=0と、初期ペアとを格納することにより、第2領域列920全体を初期化する。情報処理装置100は、第1領域列910が、ノットフル状態であるため、フラグ情報930を0に設定する。
【0175】
これにより、情報処理装置100は、全体初期化要求「S initall 0」を適切に処理することができ、複数のブロック列900の全体を初期化することができる。情報処理装置100は、複数のブロック列900の全体を初期化する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図11の説明に移行する。
【0176】
図11において、情報処理装置100は、クエリキュー800の書き込み要求「B write[2,100]300」を取り出して処理する。write[a,b]cは、ユーザRaに対応するブロック列900に、商品id=bの成分の値=cを格納することを示す。
【0177】
この場合、情報処理装置100は、ユーザR2に対応するブロック列900のうち、商品id=100の成分に対応付けられたブロック901(1101)を特定する。情報処理装置100は、ユーザR2に対応するブロック列900の末尾に存在する第2領域921(1102)が、バリュー領域になるよう、第2領域列920を更新する。
【0178】
情報処理装置100は、特定したブロック901(1101)が、バリュー状態になるよう、ユーザR2に対応するブロック列900に関するスタックポインタと、初期値とのペアを、第2領域列920に格納する。情報処理装置100は、商品id=100の成分の値=300を、特定したブロック901(1101)に格納する。情報処理装置100は、特定したブロック901(1101)が、今までオプション状態であったブロック901であれば、商品id=100の成分以外に、他の成分の値=初期値として、特定したブロック901(1101)に格納してもよい。
【0179】
これにより、情報処理装置100は、書き込み要求「B write[2,100]300」を適切に処理することができ、ユーザR2に対応するブロック列900に、商品id=100の成分の値=300を格納することができる。情報処理装置100は、書き込み要求を処理する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図12の説明に移行する。
【0180】
図13において、情報処理装置100は、クエリキュー800の書き込み要求「B write[1,300]250」を取り出して処理する。この場合、情報処理装置100は、ユーザR1に対応するブロック列900のうち、商品id=300の成分に対応付けられたブロック901(1201)を特定する。情報処理装置100は、ユーザR1に対応するブロック列900の末尾に存在する第2領域921(1202)が、バリュー領域になるよう、第2領域列920を更新する。
【0181】
情報処理装置100は、特定したブロック901(1201)が、バリュー状態になるよう、ユーザR1に対応するブロック列900に関するスタックポインタと、初期値とのペアを、第2領域列920に格納する。情報処理装置100は、商品id=300の成分の値=250を、特定したブロック901(1201)に格納する。情報処理装置100は、特定したブロック901(1201)が、今までオプション状態であったブロック901であれば、商品id=300の成分以外に、他の成分の値=初期値として、特定したブロック901(1201)に格納してもよい。
【0182】
これにより、情報処理装置100は、書き込み要求「B write[1,300]250」を適切に処理することができ、ユーザR1に対応するブロック列900に、商品id=300の成分の値=250を格納することができる。情報処理装置100は、書き込み要求を処理する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図13の説明に移行する。
【0183】
図13において、情報処理装置100は、クエリキュー800の読み出し要求「C read[2,100]」を取り出して処理する。read[a,b]は、ユーザRaに対応するブロック列900から、商品id=bの成分の値を読み出すことを示す。この場合、情報処理装置100は、ユーザR2に対応するブロック列900のうち、商品id=100の成分に対応付けられたブロック901(1301)を特定する。
【0184】
情報処理装置100は、特定したブロック901(1301)を参照して、商品id=100の成分の値を読み出す。情報処理装置100は、特定したブロック901(1301)が、オプション状態であれば、ユーザR2に対応するブロック列900の第2領域921を参照して、商品id=100の成分の値として初期値を読み出す。
【0185】
情報処理装置100は、特定したブロック901(1301)が、M領域のバリュー状態であれば、特定したブロック901(1301)から、商品id=100の成分の値を読み出す。情報処理装置100は、特定したブロック901(1301)が、W領域のバリュー状態であれば、特定したブロック901(1301)の先頭の領域のポインタが示す他のブロック901から、商品id=100の成分の値を読み出す。
【0186】
これにより、情報処理装置100は、読み出し要求「C read[2,100]」を適切に処理することができ、ユーザR2に対応するブロック列900から、商品id=100の成分の値を読み出すことができる。情報処理装置100は、読み出し要求を処理する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図14の説明に移行する。
【0187】
図14において、情報処理装置100は、クエリキュー800の行初期化要求「B init 2 0」を取り出して処理する。init a bは、ユーザRaに対応するブロック列900全体を、bの値で初期化することを示す。
【0188】
この場合、情報処理装置100は、ユーザR2に対応するブロック列900に関するスタックポインタと、初期値とのペアを初期化するよう、第2領域列920を更新する。情報処理装置100は、具体的には、ユーザR2に対応するブロック列900に関するスタックポインタ=0と、初期値=0とのペアを記憶するよう、第2領域列920を更新する。
【0189】
情報処理装置100は、より具体的には、ユーザR2に対応するブロック列900に関するスタックポインタ=0と、初期値=0とのペアを、第2領域921(1401)に格納する。結果として、情報処理装置100は、ユーザR2に対応するブロック列900のブロック901(1401)を、オプション状態に戻す。
【0190】
これにより、情報処理装置100は、行初期化要求「B init 2 0」を適切に処理することができ、ブロック列900全体を初期化することができる。情報処理装置100は、ブロック列900全体を初期化する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図15の説明に移行する。
【0191】
図15において、情報処理装置100は、クエリキュー800の書き込み要求「A write[0,100]300」を取り出して処理する。この場合、情報処理装置100は、ユーザR0に対応するブロック列900のうち、商品id=100の成分に対応付けられたブロック901(1501)を特定する。情報処理装置100は、ユーザR0に対応するブロック列900の末尾に存在する第2領域921(1502)が、バリュー領域になるよう、第2領域列920を更新する。
【0192】
情報処理装置100は、特定したブロック901(1501)が、バリュー状態になるよう、ユーザR0に対応するブロック列900に関するスタックポインタと、初期値とのペアを、第2領域列920に格納する。情報処理装置100は、商品id=100の成分の値=300を、特定したブロック901(1501)に格納する。情報処理装置100は、特定したブロック901(1501)が、今までオプション状態であったブロック901であれば、商品id=100の成分以外に、他の成分の値=初期値として、特定したブロック901(1501)に格納してもよい。
【0193】
これにより、情報処理装置100は、書き込み要求「A write[0,100]300」を適切に処理することができ、ユーザR0に対応するブロック列900に、商品id=100の成分の値=300を格納することができる。情報処理装置100は、書き込み要求を処理する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図16の説明に移行する。
【0194】
図16において、情報処理装置100は、クエリキュー800の行初期化要求「C init 3 200」を取り出して処理する。init a bは、ユーザRaに対応するブロック列900全体を、bの値で初期化することを示す。
【0195】
この場合、情報処理装置100は、ユーザR3に対応するブロック列900に関するスタックポインタと、初期値とのペアを初期化するよう、第2領域列920を更新する。情報処理装置100は、具体的には、ユーザR3に対応するブロック列900に関するスタックポインタ=0と、初期値=200とのペアを記憶するよう、第2領域列920を更新する。情報処理装置100は、より具体的には、ユーザR3に対応するブロック列900に関するスタックポインタ=0と、初期値=200とのペアを、第2領域921(1601)に格納する。
【0196】
これにより、情報処理装置100は、行初期化要求「C init 3 200」を適切に処理することができ、ブロック列900全体を初期化することができる。情報処理装置100は、ブロック列900全体を初期化する際にかかる処理時間および処理時間を、O(1)に抑制することができる。次に、図17の説明に移行し、情報処理装置100による効果の一例について説明する。
【0197】
図17の表は、第2の例に示した情報処理装置100の手法と、他の手法とを比較した結果を示す。情報処理装置100の手法は、例えば、Optimal Space Initializable Multiple Arraysと呼んでもよい。例えば、他の手法は、具体的には、複数の配列をそのまま、配列形式のデータとして記憶する手法1が考えられる。例えば、他の手法は、具体的には、ブロック列ごとに、当該ブロック列がフル状態であるか否かを示すフラグ情報を対応付けて用意する手法2が考えられる。
【0198】
ここで、例えば、手法1では、いずれかの配列に対応する配列形式のデータを初期化する際にかかる処理負担および処理時間が、O(N)になる。また、例えば、手法1では、すべての配列に対応する配列形式のデータを初期化する際にかかる処理負担および処理時間が、O(NM)になる。また、例えば、手法1では、書き込み要求、および、読み出し要求を処理する際にかかる処理負担および処理時間は、O(1)である。
【0199】
また、例えば、手法2では、すべての配列に対応するブロック列を初期化する際にかかる処理負担および処理時間が、O(M)になる。また、手法2では、配列ごとに、フラグ情報を用意することになるため、複数のブロック列を記憶する際にかかるデータ量が、O(M)になる。また、例えば、手法2では、書き込み要求、および、読み出し要求を処理する際にかかる処理負担および処理時間は、O(1)である。
【0200】
これに対し、情報処理装置100の手法では、上述した通り、いずれかの配列に対応するブロック列を初期化する際にかかる処理負担および処理時間を、O(1)に抑制することができる。また、情報処理装置100の手法では、上述した通り、すべての配列に対応するブロック列を初期化する際にかかる処理負担および処理時間を、O(1)に抑制することができる。また、情報処理装置100の手法では、上述した通り、書き込み要求、および、読み出し要求を処理する際にかかる処理負担および処理時間を、O(1)に抑制することができる。
【0201】
また、情報処理装置100の手法では、上述した通り、複数のブロック列を記憶する際にかかるデータ量を、O(1)に抑制することができる。このように、情報処理装置100は、他の手法に比べて、書き込み要求、および、読み出し要求を処理する際にかかる処理負担および処理時間を増大させることなく、初期化を効率よく実施可能にすることができる。この際、情報処理装置100は、複数のブロック列を記憶する際にかかるデータ量の増大化を抑制することができる。
【0202】
(全体初期化処理手順)
次に、図18を用いて、情報処理装置100が実行する、全体初期化処理手順の一例について説明する。全体初期化処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
【0203】
図18は、全体初期化処理手順の一例を示すフローチャートである。図18において、情報処理装置100は、全体初期化要求を受け付ける(ステップS1801)。
【0204】
次に、情報処理装置100は、全体初期化要求に応じて、第1領域列に対応するスタックポインタと初期値とのペアを初期化することにより、第1領域列を初期化する(ステップS1802)。そして、情報処理装置100は、全体初期化要求に応じて、第2領域列に対応するスタックポインタと初期値とのペアを初期化することにより、第2領域列を初期化する(ステップS1803)。
【0205】
次に、情報処理装置100は、全体初期化要求に応じて、フラグ情報を初期化する(ステップS1804)。そして、情報処理装置100は、全体初期化処理を終了する。
【0206】
(行初期化処理手順)
次に、図19を用いて、情報処理装置100が実行する、行初期化処理手順の一例について説明する。行初期化処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
【0207】
図19は、行初期化処理手順の一例を示すフローチャートである。図19において、情報処理装置100は、いずれかの行の指定を含む行初期化要求を受け付ける(ステップS1901)。
【0208】
次に、情報処理装置100は、行初期化要求に応じて、指定の行のブロック列に含まれる第1領域がオプション状態になるよう、第1領域列を更新する(ステップS1902)。そして、情報処理装置100は、行初期化要求に応じて、指定の行のブロック列に対応するスタックポインタと初期値とのペアを初期化するよう、第2領域列を更新することにより、指定の行のブロック列を初期化する(ステップS1903)。
【0209】
次に、情報処理装置100は、行初期化要求に応じて、フラグ情報を初期化する(ステップS1904)。そして、情報処理装置100は、行初期化処理を終了する。
【0210】
(書き込み処理手順)
次に、図20を用いて、情報処理装置100が実行する、書き込み処理手順の一例について説明する。書き込み処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
【0211】
図20は、書き込み処理手順の一例を示すフローチャートである。図20において、情報処理装置100は、値を書き込む対象の成分に対応付けられた、いずれかの行と、当該行のブロック列のうちいずれかのブロックとの組み合わせの指定を含む書き込み要求を受け付ける(ステップS2001)。
【0212】
次に、情報処理装置100は、書き込み要求に応じて、指定の行のブロック列を特定する(ステップS2002)。そして、情報処理装置100は、書き込み要求に応じて、特定したブロック列のうち指定のブロックを特定する(ステップS2003)。
【0213】
次に、情報処理装置100は、特定したブロックがオプション状態であるか否かを判定する(ステップS2004)。ここで、オプション状態ではない場合(ステップS2004:No)、情報処理装置100は、ステップS2010の処理に移行する。一方で、オプション状態である場合(ステップS2004:Yes)、情報処理装置100は、ステップS2005の処理に移行する。
【0214】
ステップS2005では、情報処理装置100は、特定したブロック全体を初期化し、特定したブロックをバリュー状態に変更するよう、特定したブロック列を更新する(ステップS2005)。
【0215】
次に、情報処理装置100は、特定したブロック列がフル状態であるか否かを判定する(ステップS2006)。ここで、フル状態ではない場合(ステップS2006:No)、情報処理装置100は、ステップS2010の処理に移行する。一方で、フル状態である場合(ステップS2006:Yes)、情報処理装置100は、ステップS2007の処理に移行する。
【0216】
ステップS2007では、情報処理装置100は、特定したブロック列に含まれる第2領域がバリュー状態になるよう、第2領域列を更新する(ステップS2007)。
【0217】
次に、情報処理装置100は、第2領域列がフル状態であるか否かを判定する(ステップS2008)。ここで、フル状態ではない場合(ステップS2008:No)、情報処理装置100は、ステップS2010の処理に移行する。一方で、フル状態である場合(ステップS2008:Yes)、情報処理装置100は、ステップS2009の処理に移行する。
【0218】
ステップS2009では、情報処理装置100は、フラグ情報に1を設定する(ステップS2009)。そして、情報処理装置100は、ステップS2010の処理に移行する。
【0219】
ステップS2010では、情報処理装置100は、特定したブロックに、対象の成分の値を格納する(ステップS2010)。そして、情報処理装置100は、書き込み処理を終了する。
【0220】
(読み出し処理手順)
次に、図21を用いて、情報処理装置100が実行する、読み出し処理手順の一例について説明する。読み出し処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
【0221】
図21は、読み出し処理手順の一例を示すフローチャートである。図21において、情報処理装置100は、値を読み出す対象の成分に対応付けられた、いずれかの行と、当該行のブロック列のうちいずれかのブロックとの組み合わせの指定を含む読み出し要求を受け付ける(ステップS2101)。
【0222】
次に、情報処理装置100は、読み出し要求に応じて、指定の行のブロック列を特定する(ステップS2102)。そして、情報処理装置100は、読み出し要求に応じて、特定したブロック列のうち指定のブロックを特定する(ステップS2103)。
【0223】
次に、情報処理装置100は、特定したブロックがオプション状態であるか否かを判定する(ステップS2104)。ここで、オプション状態ではない場合(ステップS2104:No)、情報処理装置100は、ステップS2109の処理に移行する。一方で、オプション状態である場合(ステップS2104:Yes)、情報処理装置100は、ステップS2105の処理に移行する。
【0224】
ステップS2105では、情報処理装置100は、特定したブロック列に含まれる第2領域を特定する(ステップS2105)。
【0225】
次に、情報処理装置100は、特定した第2領域がオプション状態であるか否かを判定する(ステップS2106)。ここで、オプション状態ではない場合(ステップS2106:No)、情報処理装置100は、ステップS2108の処理に移行する。一方で、オプション状態である場合(ステップS2106:Yes)、情報処理装置100は、ステップS2107の処理に移行する。
【0226】
ステップS2107では、情報処理装置100は、第2領域列に対応する初期値を、対象の成分の値として読み出す(ステップS2107)。そして、情報処理装置100は、読み出し処理を終了する。
【0227】
ステップS2108では、情報処理装置100は、特定した第2領域に格納された初期値を、対象の成分の値として読み出す(ステップS2108)。そして、情報処理装置100は、読み出し処理を終了する。
【0228】
ステップS2109では、情報処理装置100は、特定したブロックに格納された対象の成分の値を読み出す(ステップS2109)。そして、情報処理装置100は、読み出し処理を終了する。
【0229】
ここで、情報処理装置100は、図18図21の各フローチャートの一部ステップの処理の順序を入れ替えて実行してもよい。また、情報処理装置100は、図18図21の各フローチャートの一部ステップの処理を省略してもよい。
【0230】
以上説明したように、情報処理装置100によれば、配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶することができる。情報処理装置100によれば、複数のブロック列のそれぞれのブロック列について、当該ブロック列を、2つの範囲に分割することができる。情報処理装置100によれば、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配するよう、当該ブロック列を管理することができる。情報処理装置100によれば、それぞれのブロック列の末尾ブロックの第1領域を連結した第1領域列を、2つの範囲に分割することができる。情報処理装置100によれば、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、第1領域列を管理することができる。情報処理装置100によれば、それぞれのブロック列の末尾ブロックの第2領域を利用して、それぞれのブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持することができる。情報処理装置100によれば、第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶することができる。情報処理装置100によれば、それぞれのブロック列を、フラグ情報を用いて、末尾ブロックの一部である第1領域が、オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱うことができる。情報処理装置100によれば、それぞれのブロック列を、フラグ情報を用いて、末尾ブロックの一部である第1領域が、オプション領域ではない場合、オプションブロックが存在しないブロック列と扱うことができる。これにより、情報処理装置100は、複数のブロック列を記憶する際にかかるデータ量の増大化を抑制することができる。
【0231】
情報処理装置100によれば、それぞれのブロック列の末尾ブロックの第2領域を連結した第2領域列を、2つの範囲に分割することができる。情報処理装置100によれば、前半の範囲に、値が未設定のペアに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応するペアを分配するよう、第2領域列を管理することができる。情報処理装置100によれば、末尾領域の一部の領域に、第2領域列を分割する可変の位置を示すポインタと、第2領域列において値が未設定のペアの初期値とを保持することができる。これにより、情報処理装置100は、第2領域列を初期化し易くすることができ、第2領域列を初期化することにより、複数のブロック列全体を初期化し易くすることができる。
【0232】
情報処理装置100によれば、第1領域列について、第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配することができる。情報処理装置100によれば、末尾領域の一部の領域に、第1領域列を分割する可変の位置を示すポインタと、第1領域列において値が未設定の成分の初期値とを保持することができる。これにより、情報処理装置100は、第1領域列を管理する際にかかるデータ量の低減化を図ることができる。
【0233】
情報処理装置100によれば、複数のブロック列全体の初期化要求を受け付けることができる。情報処理装置100によれば、第2領域列の末尾の領域の一部の領域に、第2領域列を分割する位置として第2領域列の先頭を示すポインタと、第2領域列において値が未設定のペアの初期値とを格納することができる。情報処理装置100によれば、第1領域列の末尾の領域の一部の領域に、第1領域列を分割する位置として第1領域列の先頭を示すポインタと、第1領域列において値が未設定の成分の初期値とを格納することができる。情報処理装置100によれば、フラグ情報が、第1領域列において、オプション領域が存在しないことを示す値であれば、オプション領域が存在することを示す値に更新することができる。これにより、情報処理装置100は、複数のブロック列全体を初期化することができる。情報処理装置100は、複数のブロック列全体を初期化する際にかかる処理負担および処理時間を、O(1)に抑制することができる。
【0234】
情報処理装置100によれば、複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けることができる。情報処理装置100によれば、いずれかのブロック列に存在する第2領域に対応するペアに、いずれかのブロック列の先頭を示すポインタと、いずれかのブロック列において値が未設定の成分の初期値とのペアを設定することができる。情報処理装置100によれば、第1領域列のうち、いずれかのブロック列に対応する第1領域が、オプション領域になるよう、第1領域列を更新することができる。情報処理装置100によれば、フラグ情報が、第1領域列において、オプション領域が存在しないことを示す値であれば、オプション領域が存在することを示す値に更新することができる。これにより、情報処理装置100は、ブロック列全体を初期化することができる。情報処理装置100は、ブロック列全体を初期化する際にかかる処理負担および処理時間を、O(1)に抑制することができる。
【0235】
情報処理装置100によれば、配列のいずれかの成分の値の書き込み要求を受け付けることができる。情報処理装置100によれば、複数のブロック列のうち、いずれかの成分に対応する書き込み先ブロックを特定することができる。情報処理装置100によれば、特定した書き込み先ブロックが、オプションブロックであるか否かを判定することができる。情報処理装置100によれば、オプションブロックである場合、特定した書き込み先ブロックに対応する所定数の成分のうち、いずれかの成分の値と、いずれかの成分とは異なる残余の成分の初期値とを、特定した書き込み先ブロックに書き込むことができる。情報処理装置100によれば、オプションブロックではない場合、いずれかの成分の値を、特定した書き込み先ブロックに書き込むことができる。これにより、情報処理装置100は、配列のいずれかの成分の値を書き込むことができる。
【0236】
情報処理装置100によれば、配列のいずれかの成分の値の読み出し要求を受け付けることができる。情報処理装置100によれば、複数のブロック列のうち、いずれかの成分に対応する読み出し元ブロックを特定することができる。情報処理装置100によれば、特定した読み出し元ブロックが、オプションブロックであるか否かを判定することができる。情報処理装置100によれば、オプションブロックである場合、特定した読み出し元ブロックに対応する第2領域が、値が未設定のペアに対応するオプション領域であるか否かを判定することができる。情報処理装置100によれば、オプション領域であれば、第2領域列の末尾の領域の一部の領域から、いずれかの成分の初期値を読み出すことができる。情報処理装置100によれば、オプション領域でなければ、特定した読み出し元ブロックに対応する第2領域から、いずれかの成分の初期値を読み出すことができる。情報処理装置100によれば、特定した読み出し元ブロックが、オプションブロックではない場合、特定した読み出し元ブロックから、いずれかの成分の値を読み出すことができる。これにより、情報処理装置100は、配列のいずれかの成分の値を読み出すことができる。
【0237】
情報処理装置100によれば、ブロック列を、Block-wise Optional Arrayと呼ばれるデータ構造で表すことができる。情報処理装置100によれば、第1領域列を、Block-wise Optional Arrayと呼ばれるデータ構造で表すことができる。情報処理装置100によれば、第2領域列を、Block-wise Optional Arrayと呼ばれるデータ構造で表すことができる。これにより、情報処理装置100は、ブロック列、第1領域列、および、第2領域列を、効率よく管理することができる。
【0238】
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをPCやワークステーションなどのコンピュータで実行することにより実現することができる。本実施の形態で説明した情報処理プログラムは、コンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。記録媒体は、ハードディスク、フレキシブルディスク、CD(Compact Disc)-ROM、MO(Magneto Optical disc)、DVD(Digital Versatile Disc)などである。また、本実施の形態で説明した情報処理プログラムは、インターネットなどのネットワークを介して配布してもよい。
【0239】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0240】
(付記1)配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
処理をコンピュータに実行させ、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理プログラム。
【0241】
(付記2)前記第2領域は、前記第2領域を含むブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアに対応付けられ、
前記それぞれのブロック列の末尾ブロックの前記第2領域を連結した第2領域列について、前記第2領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の前記ペアに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する前記ペアを分配するよう、前記第2領域列を管理することにより、少なくとも、末尾領域の一部の領域が、前記ペアを格納しない未使用領域になるよう、前記第2領域列を管理し、当該一部の領域に、前記第2領域列を分割する可変の位置を示すポインタと、前記第2領域列において値が未設定の前記ペアの初期値とを保持する、
処理を前記コンピュータに実行させることを特徴とする付記1に記載の情報処理プログラム。
【0242】
(付記3)前記第1領域列を管理する処理は、
前記第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配することにより、少なくとも、末尾領域の一部の領域が、成分の値を格納しない未使用領域になるよう、前記第1領域列を管理し、当該一部の領域に、前記第1領域列を分割する可変の位置を示すポインタと、前記第1領域列において値が未設定の成分の初期値とを保持する、ことを特徴とする付記2に記載の情報処理プログラム。
【0243】
(付記4)前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記第2領域列の末尾の領域の一部の領域に、前記第2領域列を分割する位置として前記第2領域列の先頭を示すポインタと、前記第2領域列において値が未設定の前記ペアの初期値とを格納し、
前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記第1領域列の末尾の領域の一部の領域に、前記第1領域列を分割する位置として前記第1領域列の先頭を示すポインタと、前記第1領域列において値が未設定の成分の初期値とを格納し、
前記複数のブロック列全体の初期化要求を受け付けたことに応じて、前記フラグ情報が、前記第1領域列において、前記オプション領域が存在しないことを示す値であれば、前記オプション領域が存在することを示す値に更新する、
処理を前記コンピュータに実行させることを特徴とする付記3に記載の情報処理プログラム。
【0244】
(付記5)前記複数のブロック列のいずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記いずれかのブロック列に存在する前記第2領域に対応するペアに、前記いずれかのブロック列を分割する位置として前記いずれかのブロック列の先頭を示すポインタと、前記いずれかのブロック列において値が未設定の成分の初期値とのペアを設定するよう、前記いずれかのブロック列に対応する前記第2領域を更新し、
前記いずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記第1領域列のうち、前記いずれかのブロック列に対応する前記第1領域が、前記オプション領域になるよう、前記第1領域列を更新し、
前記いずれかのブロック列全体の初期化要求を受け付けたことに応じて、前記フラグ情報が、前記第1領域列において、前記オプション領域が存在しないことを示す値であれば、前記オプション領域が存在することを示す値に更新する、
処理を前記コンピュータに実行させることを特徴とする付記4に記載の情報処理プログラム。
【0245】
(付記6)前記配列のいずれかの成分の値の書き込み要求を受け付けたことに応じて、前記複数のブロック列のうち、前記いずれかの成分に対応する書き込み先ブロックを特定し、
特定した前記書き込み先ブロックが、前記オプションブロックである場合、特定した前記書き込み先ブロックに対応する所定数の成分のうち、前記いずれかの成分の値と、前記いずれかの成分とは異なる残余の成分の初期値とを、特定した前記書き込み先ブロックに書き込み、
特定した前記書き込み先ブロックが、前記オプションブロックではない場合、前記いずれかの成分の値を、特定した前記書き込み先ブロックに書き込む、
処理を前記コンピュータに実行させることを特徴とする付記4または5に記載の情報処理プログラム。
【0246】
(付記7)前記配列のいずれかの成分の値の読み出し要求を受け付けたことに応じて、前記複数のブロック列のうち、前記いずれかの成分に対応する読み出し元ブロックを特定し、
特定した前記読み出し元ブロックが、前記オプションブロックである場合、特定した前記読み出し元ブロックに対応する前記第2領域が、値が未設定の前記ペアに対応するオプション領域であれば、前記第2領域列の末尾の領域の一部の領域から、前記いずれかの成分の初期値を読み出し、
特定した前記読み出し元ブロックが、前記オプションブロックである場合、特定した前記読み出し元ブロックに対応する前記第2領域が、値が未設定の前記ペアに対応するオプション領域でなければ、特定した前記読み出し元ブロックに対応する前記第2領域から、前記いずれかの成分の初期値を読み出し、
特定した前記読み出し元ブロックが、前記オプションブロックではない場合、特定した前記読み出し元ブロックから、前記いずれかの成分の値を読み出す、
処理を前記コンピュータに実行させることを特徴とする付記4または5に記載の情報処理プログラム。
【0247】
(付記8)前記ブロック列は、Block-wise Optional Arrayであり、
前記第1領域列は、Block-wise Optional Arrayであり、
前記第2領域列は、Block-wise Optional Arrayである、ことを特徴とする付記4または5に記載の情報処理プログラム。
【0248】
(付記9)配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
処理をコンピュータが実行し、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理方法。
【0249】
(付記10)配列の所定数の成分に対応付けられたブロックを連結した、それぞれ異なる配列を表す複数のブロック列を記憶し、
前記複数のブロック列のそれぞれのブロック列について、当該ブロック列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方ブロックがあれば、当該前方ブロックに、後半の範囲に存在する後方ブロックに対応する一部の成分の値を分配することにより、少なくとも、末尾ブロックの一部である複数の領域が、成分の値を格納しない未使用領域になるよう、当該ブロック列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第1領域を連結した第1領域列について、前記第1領域列を分割した2つの範囲のうち、前半の範囲に、値が未設定の成分のみに対応する前方領域があれば、当該前方領域に、後半の範囲に存在する後方領域に対応する一部の成分の値を分配するよう、前記第1領域列を管理し、
前記それぞれのブロック列の末尾ブロックの前記複数の領域のうち第2領域を利用して、前記それぞれのブロック列について、当該ブロック列を分割する可変の位置を示すポインタと、当該ブロック列において値が未設定の成分の初期値とのペアを保持し、
前記第1領域列において、値が未設定の成分のみに対応するオプション領域が存在するか否かを示すフラグ情報を記憶する、
制御部を有し、
前記それぞれのブロック列は、前記フラグ情報を用いて、末尾ブロックの一部である前記第1領域が、前記オプション領域である場合、値が未設定の成分のみに対応するオプションブロックが存在するブロック列と扱われ、末尾ブロックの一部である前記第1領域が、前記オプション領域ではない場合、前記オプションブロックが存在しないブロック列と扱われる、ことを特徴とする情報処理装置。
【符号の説明】
【0250】
100 情報処理装置
110,500,900 ブロック列
111,510,511,512,513,514,901 ブロック
120,710,910 第1領域列
121,711,911 第1領域
131,712,721,921 第2領域
140,601,630,730,930 フラグ情報
200 情報処理システム
201 情報蓄積装置
202 クライアント装置
210 ネットワーク
300 バス
301 CPU
302 メモリ
303 ネットワークI/F
304 記録媒体I/F
305 記録媒体
400 記憶部
401 取得部
402 管理部
403 更新部
404 格納部
405 読出部
406 出力部
520 スタックポインタ
600 初期値
611 末尾領域
620 末尾領域列
720,920 第2領域列
741,742,751,752,761,762 符号
800 クエリキュー
810 表
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21