以C#/最快的方式实现稀疏数组,将整数映射到特定的桶/范围号

thr*_*thr 11 c# algorithm

我最初的问题是我需要在C#中实现一个非常快速的稀疏数组.最初的想法是使用法线Dictionary<uint, TValue>并将其包装在我自己的类中以仅显示TValue类型参数.事实证明这很慢.

所以我的下一个想法是将所需范围(UInt32.MinValueto UInt32.MaxValue)中的每个整数映射到某个大小的存储桶并使用它.所以我正在寻找一种将无符号整数X映射到桶Y的好方法,例如:

将数字0-1023映射到8个不同的桶,每个桶包含128个数字,0-127,128-255.

但是,如果某人有更好的方法在C#中实现快速稀疏数组,那么这也是最受欢迎的.

Tim*_*mwi 5

我也注意到,Dictionary<K,V>当键是整数时,它很慢.我不确切知道为什么会这样,但我为uintulong键写了一个更快的哈希表实现:

注意事项/缺点:

  • 64位(密钥是ulong)是通用的,但另一个(密钥是uint)假设int值,因为这是我当时所需的全部内容; 我相信你可以很容易地制作这个通用的.

  • 目前,容量永远确定哈希表的大小(即它不会增长).

  • 截至20110524我使用ulong密钥(0到10_000之间的100个随机值)和Action(()=> {})值与Jon Skeet的BenchmarkHelper框架10_000相互比较Dictionary <K,V>和Efficient64bitHashtable <T>每次迭代,发现Dictionary <K,V>的速度提高了约223%.(两种结构比for/for循环结构快3000%+.)增加到1_000个键和100_000次迭代导致Dictionary <K,V>快约228%.我正在替换使用迭代方法的生产代码,每晚约7MM.所以这不仅仅是一项练习. (3认同)
  • 我将容量保留为默认值214373,在我的迭代测试(使用List)和Dictionary <K,V>中,我也将容量参数指定为214373.我的理论是,词典<K,V>的内部已经改变,这就是我花时间发表评论的原因.我将重新确定与Efficient32bitHashTable的基准,以确定. (2认同)

Ian*_*ose 2

有 101 种不同的方法来实现稀疏数组,具体取决于以下因素:

  • 数组中有多少项
  • 项目如何聚集在一起
  • 空间/速度贸易
  • ETC

大多数教科书都有关于稀疏数组的章节,只需谷歌一下就会出现很多点击。然后你必须将代码翻译成C#,或者只是使用别人写的代码,我毫不费力地找到了两个(我不知道这些有多好)

  • -1,因为“学习如何设计备用数组”对于尝试学习如何设计稀疏数组的人来说没有任何帮助。 (14认同)
  • 对于新手来说,请注意,实际上 101 可能低估了这一点。 (3认同)