以C#/最快的方式实现稀疏数组,将整数映射到特定的桶/范围号
我最初的问题是我需要在C#中实现一个非常快速的稀疏数组。 最初的想法是使用普通的Dictionary
并将其包装在我自己的类中,只显示TValue
类型参数。 事实certificate这很慢。
所以我的下一个想法是将所需范围内的每个整数( UInt32.MinValue
到UInt32.MaxValue
) UInt32.MinValue
到某个大小的存储桶并使用它。 所以我正在寻找一种将无符号整数X映射到桶Y的好方法,例如:
将数字0-1023映射到8个不同的桶,每个桶包含128个数字,0-127,128-255。
但是,如果某人有更好的方法在C#中实现快速稀疏数组,那么这也是最受欢迎的。
我也注意到,当键是整数时, Dictionary
很慢。 我不确切知道为什么会这样,但我为uint
和ulong
键写了一个更快的哈希表实现:
- Efficient32bitHashTable和Efficient64bitHashTable
注意事项/缺点:
-
64位(密钥是
ulong
)是通用的,但另一个(key是uint
)假定为int
值,因为那是我当时所需要的; 我相信你可以很容易地制作这个通用的。 -
目前, 容量永远确定哈希表的大小(即它不会增长)。
根据以下因素,有101种不同的方法来实现稀疏数组:
- 数组中有多少项
- 如何将项目聚集在一起
- 空间/速度交易
- 等等
大多数教科书都有一个关于稀疏arrays的部分,只是在Google上做了大量的点击。 然后你必须将代码翻译成C#,或者只使用其他人编写的代码,我已经找到了两个没有太多努力(我不知道它们有多好)
- 使用专业arrays加速您的代码
- SparseArray for C#