Data structures 长尾分布中发生计数的数据结构

Data structures 长尾分布中发生计数的数据结构,data-structures,ocaml,hashtable,trie,find-occurrences,Data Structures,Ocaml,Hashtable,Trie,Find Occurrences,我有一个巨大的元素列表(数千万)。 我试图计算这些元素的几个子集的出现次数。 发生分布呈长尾分布 数据结构当前看起来像这样(在OCaml风格中): 类型元素\u键 类型元素\u aggr\u键 输入原始数据=元素密钥列表 类型元素_stat= { 出现:(element_key,int)Hashtbl.t; } 类型统计= { element_stat_hashtable:(element_aggr_key,element_stat)Hashtbl.t; } 元素_stat当前使用哈希表,其中

我有一个巨大的元素列表(数千万)。 我试图计算这些元素的几个子集的出现次数。 发生分布呈长尾分布

数据结构当前看起来像这样(在OCaml风格中):

类型元素\u键
类型元素\u aggr\u键
输入原始数据=元素密钥列表
类型元素_stat=
{
出现:(element_key,int)Hashtbl.t;
}
类型统计=
{
element_stat_hashtable:(element_aggr_key,element_stat)Hashtbl.t;
}
元素_stat当前使用哈希表,其中键是每个元素,值是整数。但是,这是低效的,因为当许多元素只有一个引用时,引用哈希表会被调整多次大小。 我无法通过设置一个较大的初始大小来避免调整引用哈希表的大小,因为实际上有许多元素\ u stat实例(stat中哈希表的大小很大)


我想知道这个用例是否有更有效的(内存和/或插入)数据结构。我发现了很多现有的数据结构,比如trie、基数树、Judy数组。但是我很难理解它们之间的差异以及它们是否适合我的问题。

这里有一个表映射
element\u aggr\u key
到表,这些表依次映射
element\u key
int
。出于所有实际目的,这相当于将
element\u aggr\u key*element\u key
映射到
int
的单个表,因此您可以执行以下操作:

type stat = (element_aggr_key * element_key, int) Hashtbl.t

然后,您有一个单独的哈希表,您可以给它一个巨大的初始大小。

您只是担心调整大小,还是将其视为真正的性能瓶颈?总的来说,我相信,调整大小会增加一个日志因素。调整大小在开始时经常发生,但当时表很小。后来,这种情况几乎从未发生过。我有过一次调整尺寸成本很高的经历。不过,我没有任何数字。我还知道,在一次出现大量密钥(大约一百万)的特殊情况下(参见长尾分布),会发生调整大小的情况。