Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm table()添加和删除值_Algorithm_R_Hashtable - Fatal编程技术网

Algorithm table()添加和删除值

Algorithm table()添加和删除值,algorithm,r,hashtable,Algorithm,R,Hashtable,我试图创建一个高效的table()计算(获取向量中每个值的频率)。与普通table()函数的区别在于,它需要支持在不重新计算整个表的情况下添加和删除值 我想用一个哈希表。对于add:查找键,在值中添加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)

我试图创建一个高效的table()计算(获取向量中每个值的频率)。与普通table()函数的区别在于,它需要支持在不重新计算整个表的情况下添加和删除值

我想用一个哈希表。对于add:查找键,在值中添加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根据您期望的计数密度,可以使用命名整数向量,也可以使用常规整数向量。计数没有限制(可以是1000或更多)。如何使用整数向量获得频率?如果我遗漏了一些内容,很抱歉。这是否使用了
散列
包?据我所知,R基中没有这样的函数。。。比较一下hadley建议的简单使用命名整数向量和您的解决方案Yes之间的性能会很有趣。这里正在使用散列包。我使用建议的解决方案和infotheo::熵对Shannon熵计算进行了一些比较。结果基本相同。计数并不重要——你有多少个值?它们是密集的还是稀疏的?i、 e.如果你只是根据它们的位置将计数放入一个整数向量中,向量的百分比是多少?
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)
}