0

効率的な table() 計算を作成しようとしています (ベクトル内の各値の頻度を取得します)。通常の table() 関数との違いは、テーブル全体を再計算せずに値の追加と削除をサポートする必要があることです。

ハッシュテーブルを使用することを考えました。追加の場合: キーを探し、値に 1 を追加します。削除の場合: キーを探します。見つかった場合: 値から 1 を引きます。見つからない場合: 値 = 1 で新しいキーを追加します。

他のアイデアがあるかどうか疑問に思っていました。

例:

X

key  freq
1    3
2    5
3    2
8    1

remove(8)

key  freq
1    3
2    5
3    2


add(2)

key  freq
1    3
2    6
3    2

効率的な実装のためのアイデアはありますか? 前もって感謝します!

- 編集 -

誰かが興味を持っている場合は、私の現在のコード(シャノンエントロピーの計算も含まれます)

create.freq.hash<-function(x)
{
  t<-table(x)

  h<-hash(names(t),as.numeric(t));
  return(h);

}

freq.hash.add<-function(hash,key)
{
  if(is.null(hash[[key]]))
  {
    .set(hash,key,+1)
  }
  else
  {
    .set(hash,key,hash[[key]]+1)
  }
}

freq.hash.remove<-function(hash,key)
{
  if(!is.null(hash[[key]]))
  {
    if(hash[[key]]==1)
      del(key,hash)
    else
      .set(hash,key,hash[[key]]-1)
  }
}

hash.entropy<-function(hash)
{
  if(is.empty(hash))
    return;

  v<-values(hash);
  v.prob<-v/sum(v);
  entropy = (-1)*(v.prob%*%log2(v.prob))
  return(entropy)
}
4

0 に答える 0