19

タイプのオブジェクトがどのように実装されているのか興味がありますlist。それは...ですか

  1. いっぱいになると自動的にサイズが大きくなる動的ベクトル。
  2. アイテムの追加は ですO(1)が、アイテムへのアクセスは ですO(n)
  3. O(log(n))アイテムにアクセスできるツリー構造。
  4. O(1)アイテムにアクセスできるハッシュテーブル。

リストにはハッシュ テーブルのように見えるキーと値のペアを含めることができるため、興味がありますが、要素はベクトルのように順番に並んでいます。

編集:length(list(runif(1e4)))は 1 であるため、要素をリストに追加すると、毎回リスト全体をコピーするように見え、非常に遅くなります:

ただし、アクセス速度はベクトルよりもはるかに遅くなります。

z1 <- runif(1e4)
system.time({
  for(i in 1:10000) z1[[1 + i]] <- 1
})

出力:

user  system elapsed 
0.060   0.000   0.062 

しかし:

z1 <- list(runif(1e4))
system.time({
  for(i in 1:10000) z1[[1 + i]] <- 1
})

出力:

user  system elapsed 
1.31    0.00    1.31 

10000 要素のリストを初期化します。

z1 <- as.list(runif(1e4))
system.time({
  for(i in 1:10000) z1[[1 + i]] <- 1
})

出力:

user  system elapsed 
0.060   0.000   0.065 

キーと値のアクセスの場合:

z1 <- list()
for(i in 1:10000){key <- as.character(i); z1[[key]] <- i} 
system.time({
  for(i in 1:10000) x <- z1[["1"]]
})
system.time({
  for(i in 1:10000) x <- z1[["10000"]]
})

出力は次のとおりです。

user  system elapsed 
0.01    0.00    0.01 
user  system elapsed 
1.78    0.00    1.78 

アクセスではないO(1)ので、ハッシュテーブルではありません。私の結論は、アイテムを追加すると毎回メモリアクセスが発生するため、動的配列ではないということです。キーによるアクセスは ではないため、ハッシュテーブルではありませんO(1)

4

1 に答える 1

15

リストは基本的に、R オブジェクトの単なる配列です ( SEXP)。サイズを変更すると、データ全体のコピーが発生し、名前の検索は線形になります。

または、ハッシュ テーブルを内部的に使用する環境を使用することもできます。

于 2013-04-21T08:52:04.533 に答える