効率的な 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)
}