web-dev-qa-db-ja.com

ベクターデータ構造とは

私はベクターをC++とJavaで知っています。それは動的配列のようなものですが、ベクターのデータ構造の一般的な定義は見つかりません。では、ベクターとは何ですか? Vectorは一般的なデータ構造(arrray、stack、queue、treeなど)ですか、それとも言語に応じた単なるデータ型ですか?

14
Ikarus

コンピューターサイエンス/プログラミングに適用される「ベクトル」という言葉は数学から借用されているため、混乱を招く可能性があります(質問が複数のテーマに当てはまる場合もあります)。

数学におけるベクトルの最も単純な例は、基本的な数学を教えるために使用される数値線です(特に、負の数値の可視化、負の数値の減算、負の数値の加算など)。

ベクトルは、ポイントからの距離と方向です。ベクトルデータ構造は3Dグラフィックエンジンで使用される構造のX、Y、Z、または2Dポイント(X、Yのみ)の3点であるため、議論を混乱させる可能性があります。そのコンテキストでは、このような2つのポイントを減算すると、ベクトルが得られます。ベクトルは、ソースオペランドの1つから他のオペランドまでの距離と方向を表します。

これは、stlベクトルまたはJavaベクトルのようなストレージに適用されます。そのストレージは、アドレスからの距離として表されます(メモリアドレスは、空間内のポイント、または数直線上にあります) )。

配列はベクトルに割り当てられたストレージになる可能性があるため、概念は配列に関連していますが、ベクトルは配列よりも大きな概念であることを提出します。ベクトルには開始点からの距離の概念が含まれている必要があり、配列の開始点を開始点と考える場合、配列の終了点までの距離はそのサイズです。

したがって、ベクトルを表すデータ構造にはサイズを含める必要がありますが、配列にはサイズを含めるためのストレージがなく、割り当て方法によって想定されます。つまり、配列を動的に割り当てる場合、その配列のサイズを格納するデータ構造はなく、プログラマはそのサイズを知っているか、整数または長整数で格納することを前提とする必要があります。

ベクトルデータ構造(たとえば、ベクトルクラスの設計)はサイズを格納する必要があるため、少なくとも、開始点(配列のベース、またはメモリ内のアドレス)とそこからの距離があります。サイズを示すポイント。

ただし、説明ではまだ「RAM」指向です。これは、ベクトルを記述するデータの一部である必要があるまだ説明されていないポイントがもう1つあるためです-要素サイズの概念です。ベクトルがバイトを表し、メモリストレージが通常バイトで測定される場合、アドレスと距離(またはサイズ)はバイトのベクトルを表しますが、それ以外は何も表しません。これは非常にマシンレベルの考え方です。上位構造の考えは、いくつかの構造のそれはそれ自身のサイズを持っています-例えば、floatまたはdoubleのサイズ、またはC++の構造またはクラスのサイズです。要素のサイズが何であっても、N個の要素を格納するために必要なメモリには、ベクトルデータ構造が格納しているものとその大きさに関する知識が必要です。これが、「文字列のベクトル」または「点のベクトル」の観点から考える理由です。ベクトルには要素サイズも格納する必要があります。

そのため、基本的なベクターデータ構造には次のものが必要です。

住所(出発点)

要素のサイズ(格納するものはそれぞれXバイト長です)

格納されている要素の数(要素の数×要素サイズが「最小」ストレージサイズ)。

ベクターデータ構造のエントリのこの単純な3項目リストで行われた1つの重要な「仮定」は、アドレスが割り当てられたメモリであり、ある時点で解放する必要があり、ベクターの終わりを超えたアクセスから保護されることです。

それは何か不足していることを意味します。ベクタークラスを機能させるためには、ベクターに格納されているアイテムの数と、そのストレージに割り当てられているメモリの量に明らかな違いがあります。通常、STLのベクターの使用からわかるように、10個のアイテムを保存するスペースがあることを「知っている」場合がありますが、現在は2個しかありません。

そのため、作業用ベクトルクラスもメモリ割り当て量を保存する必要があります。これは、動的に拡張できる方法です。ストレージを自動的に拡張するのに十分な情報が得られます。

ベクトルクラスをどのように操作するかを考えてみると、ベクトルクラスを操作するために必要なデータの構造がわかります。

18
JVene

これは、動的に割り当てられたスペースを持つ配列です。このスペースを超えるたびに、メモリ内の新しい場所が割り当てられ、古い配列が新しい配列にコピーされます。古いものは解放されます。

さらに、vectorは通常、必要以上のメモリを割り当てるため、新しい要素が追加されたときにすべてのデータをコピーする必要はありません。

リストははるかに優れているように見えるかもしれませんが、必ずしもそうではありません。ベクターを頻繁に(サイズの点で)変更しない場合、コンピューターのキャッシュメモリ機能は、ベクターよりもメモリ空間で連続的であるため、リストよりもはるかに優れています。欠点は、大きなベクターがある場合に、拡張する必要があることです。次に、大量のデータをメモリ内の別のスペースにコピーすることに同意する必要があります。

そのうえ。ベクトルの最後と前に新しいデータを追加できます。ベクターは配列に似ているため、ベクターの先頭に要素を追加するたびに、すべての配列をコピーする必要があります。ベクトルの最後に要素を追加する方がはるかに効率的です。リンクリストにはこのような問題はありません。

ベクターは、内部に保持されるデータへのランダムアクセスを提供しますが、リスト、キュー、スタックはそうではありません。

7
DawidPi