Python のリストや辞書、PHP の連想配列 (基本的にはハッシュ テーブル)、C++ のベクトルなど、私が経験した一般的な言語で使用されるさまざまなデータ構造について学ぼうとしています。
R を熱心に使用している同僚がたくさんいますが、ベクトル、行列、データ フレームが R でどのように実装されているのか疑問に思っていました。それらの長所と短所は何ですか? ソースコードを調べていましたが、データ構造自体を見つけることができませんでした。これらの定義はソース コードのどこにありますか?
Python のリストや辞書、PHP の連想配列 (基本的にはハッシュ テーブル)、C++ のベクトルなど、私が経験した一般的な言語で使用されるさまざまなデータ構造について学ぼうとしています。
R を熱心に使用している同僚がたくさんいますが、ベクトル、行列、データ フレームが R でどのように実装されているのか疑問に思っていました。それらの長所と短所は何ですか? ソースコードを調べていましたが、データ構造自体を見つけることができませんでした。これらの定義はソース コードのどこにありますか?
すでに述べたように、"R internals"マニュアルと "Writing R extensions" のこの部分を確認してください。
R Internals、1.1 SEXP から:
... R オブジェクトの基本的なビルディング ブロックは、しばしばノードと呼ばれます... どちらのタイプのノード構造も、最初の 3 つのフィールドとして 32 ビットの spxinfo ヘッダーを持ち、次に 3 つのポインター (属性と前のノードと次のノードへ) を持ちます。二重連結リスト)
したがって、R のベクトルは二重連結リストとして実装されます。また、単一ノードの連結リストよりも小さいデータ構造は存在しないようです。これは次のように明らかです。
> a <- 4
> a[1]
4
他の人が述べたように:とbuiltin.c
がdo_makevector
あり、 のソースがあります。さらに、 のソースとのソースが含まれています。do_makelist
array.c
do_matrix
array.c
allocMatrix
memory.c
allocVector
進行中の多くのことは私の頭の中にありましたが、行列は単純に二重連結リストの二重連結リストであることは明らかです。行名と列名 (データ フレームに格納されているものなど) は、各リストの「属性」に格納されていると思います (確信はありませんが)。
データ構造の実装の「長所と短所」に対する応答は、(私の限られた知識から) 動的メモリ割り当てがより単純であり、コピーとコピーのオーバーヘッドを必要としないという点で、二重にリンクされたリストには強みがあるということです。配列全体を再割り当てし、弱点は (リストへのポインターの数に応じて: ヘッド、テール、ミドル、クォーターなど)、ランダムな値にアクセスするとv[99]
、目的の要素の前にいくつかの要素を反復処理するオーバーヘッドが発生する可能性があることです。見つかった。
これは正しいです?