Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Mapping 将整数映射到整个范围_Mapping_Integer_Range - Fatal编程技术网

Mapping 将整数映射到整个范围

Mapping 将整数映射到整个范围,mapping,integer,range,Mapping,Integer,Range,我使用哈希表(dotnetdictionary对象)作为稀疏二维数据集的一部分。散列表中的大多数条目将靠得很近。我可能会得到100~10000个条目,所有条目都聚集在零附近。我已经读到,当散列分布在整个整数(32位)范围内时,散列表的性能更好 有没有一种便宜的方法可以将连续整数以1:1的方式映射到完全不同的值上?我不必将它们映射回去,这纯粹是单向的。如果您知道密钥集的最大值(kmax),可以通过常数因子(乘数)进行扩展,比如乘以固定素数,使乘积保持在最大整数大小以下(2^31-1): i、 e.

我使用哈希表(dotnetdictionary对象)作为稀疏二维数据集的一部分。散列表中的大多数条目将靠得很近。我可能会得到100~10000个条目,所有条目都聚集在零附近。我已经读到,当散列分布在整个整数(32位)范围内时,散列表的性能更好


有没有一种便宜的方法可以将连续整数以1:1的方式映射到完全不同的值上?我不必将它们映射回去,这纯粹是单向的。

如果您知道密钥集的最大值(kmax),可以通过常数因子(乘数)进行扩展,比如乘以固定素数,使乘积保持在最大整数大小以下(2^31-1):

i、 e.最接近
(2^30)/kmax

注意:确保使用的素数与哈希表中的桶数不同


这里还有另一个解决方案:由于.NET类将为同一种子生成相同的值,因此您可以使用该值来分发传入的密钥。

如果您知道密钥集的最大值(kmax),您可以按常量因子(乘数)进行扩展,假设乘以一个固定素数,使乘积小于最大整数大小(2^31-1):

i、 e.最接近
(2^30)/kmax

注意:确保使用的素数与哈希表中的桶数不同


这里还有另一个解决方案:由于.NET类将为同一种子生成相同的值,因此可以使用该值来分发传入的键。

不使用Integer,而是编写一个从Integer继承的类,并重写GetHashCode函数。这样,您不必做任何事情,只需创建此函数

我能想到的均匀分布值的最简单方法是执行以下操作:

public class MyInteger:Integer
{
    public override int GetHashCode()
    {
       unchecked
       {
           return (int)Math.Pow(this,this);
       }
    }
}

很好且均匀地分割,同时尽量减少工作量。

不要使用Integer,而是编写一个从Integer继承的类,并重写GetHashCode函数。这样,您不必做任何事情,只需创建此函数

我能想到的均匀分布值的最简单方法是执行以下操作:

public class MyInteger:Integer
{
    public override int GetHashCode()
    {
       unchecked
       {
           return (int)Math.Pow(this,this);
       }
    }
}

很好,平均地分开,同时尽量减少工作量。

也许我误解了你的意思,但字典已经会对你的整数进行哈希运算了。不需要预先对它们进行散列。为什么不试试默认的实现,看看它是如何运行的,而不是尝试一个可能毫无意义的预优化。

也许我误解了你的意思,但字典已经在散列你的整数了。不需要预先对它们进行散列。为什么不尝试一下默认的实现,看看它是如何运行的,而不是尝试一个可能毫无意义的预优化。

@Erich,谢谢,但是这能保证为每个可能的整数提供唯一的映射吗?不会,但假设它们合理地聚集在一起,它们就会。此外,您不需要哈希表工作方式的唯一映射。它们将足够分散,使你的速度相当快。除了范围之外,您最好只使用带有int索引的数组。每个空位只需要4个字节,所以不会太大。您提到它的最高值是10000,因此只有40000字节,或者说整个数组的40k字节,这将有一个O(1)搜索和插入时间。如果你愿意放弃一个k的内存,最好是这样做。好的一点,我不介意在这上面花费很多内存,因为它只需要非常短暂的内存。我也将尝试这种方法,看看它是否优于哈希表方法。谢谢.NET中的整数类是什么??:o@Erich,谢谢,但这能保证为每一个可能的整数提供唯一的映射吗?不会,但假设它们是合理聚集的,它们会。此外,您不需要哈希表工作方式的唯一映射。它们将足够分散,使你的速度相当快。除了范围之外,您最好只使用带有int索引的数组。每个空位只需要4个字节,所以不会太大。您提到它的最高值是10000,因此只有40000字节,或者说整个数组的40k字节,这将有一个O(1)搜索和插入时间。如果你愿意放弃一个k的内存,最好是这样做。好的一点,我不介意在这上面花费很多内存,因为它只需要非常短暂的内存。我也将尝试这种方法,看看它是否优于哈希表方法。谢谢.NET中的整数类是什么??:首先,真正的性能杀手不是使用字典的问题。真正的杀手是当您最终得到一个表,其中多个对象具有相同的键,但这不是dictionary的选项。此外,它不会让你的对象分散在任意一组重要的键值上。像1,2,3,4这样的集合使用的内存可能少于1 1024 1089992^32-1要提高.NET中字典的性能,必须平衡冲突率和哈希速度。要有一个完美的哈希而不发生冲突,这将更加耗时。同样,最快的散列算法也会有更多的冲突。找到平衡点是关键,在这方面,BCL团队会做好他们可信的工作,因此,除非你有性能问题,否则就依靠它。首先,真正的性能杀手不是使用字典的问题。真正的杀手是当您最终得到一个表,其中多个对象具有相同的键,但这不是dictionary的选项。此外,它不会让你的对象分散在任意一组重要的键值上。像1,2,3,4这样的集合可能会使用少于1 1024 1089992^32-1的内存来提高性能