是否有任何熟知的库Java对于稀疏的位矢量?

(并且是有指导方针如何疏是有用的,用它们与 java。工具.特集?)

有帮助吗?

解决方案

柯尔特的图书馆 有稀疏的矩阵(1D、2D和3D)。它还有一个有效的BitVector,有1位每价值,而不是8位作 boolean[] 不。

然而,稀疏的矩阵不支持位直接只一倍,并对象。你可以包1D疏双矩阵的马平bit index长指数 (bitIndex>>6) 由于每个长期持有64位, 转换 检索的双到生长的价值,并使用特使访问位的检索到长。一个小的工作,但远不如更为实施疏矢量自己。一旦您的包装工作时,你可能避免转换双打来的渴望,并实现一个真正的稀疏长1d矩阵的使用可用的柯尔特的源代码的双1D疏矩阵作为一个起点。

编辑:更多的信息。柯尔特矢量/矩阵中需要没有存储器最初进行存储,假设所有的位(long)最初是0.设置一个值非零消耗存储器。设定值回到0继续占用的存储器,虽然存为零值收回周期性。

如果这位是真正的稀疏,使得每个衬长值只有一个位置,那么存储的开销将是非常贫困,需要64-比特实际位存储。但如你所提及的典型情况下,为20-40%稀疏,那么开销将低得多,可能没有浪费的储存,如果位都集中在范围,例如位从0-100,然后以1000-1100,2000到2200(价值在六角) 总体而言,只有1/16的区域被分配到位,但聚类意味着的位存储没有浪费空间。

其他提示

TL; DR去这里高效稀疏的BitSet实现

我知道这是一个“老”的问题,但有我碰到这个岗位绊倒了同样的问题。虽然答案都不错,我最终没有得到满足。进一步挖掘后,我想我已经遇到了“明确的”答案在Java中稀疏的位集的问题。

此介绍作者,博士布鲁斯·哈登,讨论了他的研究人员的努力,创造一个具有很高的内存效率和高性能的替代标准的Java位集合。

在原来指向他的介绍是死了,但我接触哈顿博士,并保存在这里无论是代码和演示:

https://github.com/brettwooldridge/SparseBitSet

我不推荐更高阅读本文稿。它甚至如果你有稀疏位设置不感兴趣迷人的阅读,它更多的是解决问题...

的本色

幻灯片:这是计算机科学,软件工程,或黑客?

如果其确实稀疏(例如,小于1%填充量),然后使用由比特索引索引的散列表可能是相当不错的;在表中的索引单纯的存在与否是所有你需要知道,如果该位分别为一或零。

如果密度的百分之几向上,可以使用通过比特索引除以64,和存储的词语的含有实际位哈希表索引的散列表。位Ñ是如果哈希表包含值设置 V INT(N / 64)(V >>(N模64))&1 为真。

这两个答案,假设你想要优化位随机访问。如果要优化的顺序(或其他访问)由索引位,则可能需要一个稀疏矩阵结构,使用相同类型的低级比特向量表示的取决于预期密度。请参阅稀疏矩阵

您可以尝试 FastUtil的AVL树地图

CERN COLT被广泛用于向量和矩阵运算,并且具有稀疏矩阵,但不特别用于位向量。

HTTP://acs.lbl .GOV /软件/小马/ API / CERN /小马/基质/ IMPL / SparseObjectMatrix1D.html

一个哈希表,其中该键的单纯的存在或不存在告诉你什么?这将是设置,那么哈希!我是持怀疑态度的集合(甚至散列一个)在BitSet的性能。这实际上取决于速度或存储器是否是主驾驶员。

您可以尝试JavaEWAH库。

https://code.google.com/p/javaewah/

根据您的问题,它可能是一个不错的选择。

(它被用于通过Apache的蜂房等。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top