Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
C 存储大随机数的最佳哈希函数是什么?_C_Algorithm_Data Structures - Fatal编程技术网

C 存储大随机数的最佳哈希函数是什么?

C 存储大随机数的最佳哈希函数是什么?,c,algorithm,data-structures,C,Algorithm,Data Structures,我想在数据结构中存储大量的数字,为此,我想使用哈希函数,这样插入、删除或搜索就可以很快。但我无法决定应该使用哪个哈希函数 一般来说,我想知道如何判断散列函数对任何特定的问题都有效 编辑:我认为,一个让人对使用“随机”一词感到困惑的词。这里是随机数,我的意思是,我没有任何特定的数字范围,我必须从中选择[任何32位整数],但我有总的数字,它将被赋予存储在数据结构中,比如5000个数字。所以建议我这个场景中最好的散列函数,为什么你们认为它是最好的 如果数字是一致随机的,只需使用选择低位的哈希函数即可

我想在数据结构中存储大量的数字,为此,我想使用哈希函数,这样插入、删除或搜索就可以很快。但我无法决定应该使用哪个哈希函数

一般来说,我想知道如何判断散列函数对任何特定的问题都有效


编辑:我认为,一个让人对使用“随机”一词感到困惑的词。这里是随机数,我的意思是,我没有任何特定的数字范围,我必须从中选择[任何32位整数],但我有总的数字,它将被赋予存储在数据结构中,比如5000个数字。所以建议我这个场景中最好的散列函数,为什么你们认为它是最好的

如果数字是一致随机的,只需使用选择低位的哈希函数即可

unsigned hash_number(long long x)
{
    return (unsigned) x;
}

如果数字是一致随机的,只需使用一个选择低位的哈希函数

unsigned hash_number(long long x)
{
    return (unsigned) x;
}

你的问题对我来说毫无意义。使用散列算法来存储一些随机数是过分的。如果问题还有其他方面,那么数据结构的选择将取决于“更多”是什么(您没有说)

如果这些数字真的是随机或伪随机的,那么您只需要一个堆栈或循环缓冲区—将新随机数添加(推送)到数据结构中的功能,以及从结构中删除(弹出)现有随机数的功能。如果要按顺序检索它们,请使用循环缓冲区。散列函数在各个方面都比用于保存随机数列表的简单堆栈(或循环缓冲区)更糟糕—它更复杂,运行速度较慢,并且占用更多内存

大多数语言/环境都提供了可以使用(或作为“dictionary”类提供)的哈希函数,并提供了有关效率的指导。通常,您可以通过分配更多内存来加快字典类的速度——当哈希键发生冲突时,它们会减慢速度。因此,在所有可能的数字中,实际数字的“密度”很重要

因此,如果你必须持有100个这样的数字,你可以使用一个只看最后12位的散列函数。这就给出了2^12=4096个可能的散列,因此碰撞只会在100/2048的时间内发生,小于5%。另一方面,您使用的内存是您应该使用的内存的20多倍。(此函数与以2^12为基数的数字模数相同,与Epp建议的类似。)

编写一个基于哈希函数的存储类,它可以正确地处理哈希冲突(这是必须的),优雅地处理重复的数据,在丢弃坏数据时不会发疯(就像每个数字一样),而且效率很高,这不是一项简单的任务

另一方面,实现堆栈或循环缓冲区非常简单、高效,并且具有完全可预测的行为


你确定你没有把事情弄得太复杂吗?

你的问题对我来说毫无意义。使用散列算法来存储一些随机数是过分的。如果问题还有其他方面,那么数据结构的选择将取决于“更多”是什么(您没有说)

如果这些数字真的是随机或伪随机的,那么您只需要一个堆栈或循环缓冲区—将新随机数添加(推送)到数据结构中的功能,以及从结构中删除(弹出)现有随机数的功能。如果要按顺序检索它们,请使用循环缓冲区。散列函数在各个方面都比用于保存随机数列表的简单堆栈(或循环缓冲区)更糟糕—它更复杂,运行速度较慢,并且占用更多内存

大多数语言/环境都提供了可以使用(或作为“dictionary”类提供)的哈希函数,并提供了有关效率的指导。通常,您可以通过分配更多内存来加快字典类的速度——当哈希键发生冲突时,它们会减慢速度。因此,在所有可能的数字中,实际数字的“密度”很重要

因此,如果你必须持有100个这样的数字,你可以使用一个只看最后12位的散列函数。这就给出了2^12=4096个可能的散列,因此碰撞只会在100/2048的时间内发生,小于5%。另一方面,您使用的内存是您应该使用的内存的20多倍。(此函数与以2^12为基数的数字模数相同,与Epp建议的类似。)

编写一个基于哈希函数的存储类,它可以正确地处理哈希冲突(这是必须的),优雅地处理重复的数据,在丢弃坏数据时不会发疯(就像每个数字一样),而且效率很高,这不是一项简单的任务

另一方面,实现堆栈或循环缓冲区非常简单、高效,并且具有完全可预测的行为


你确定你没有让这变得比需要的更复杂吗?

即使你的输入数字是完全随机的,使用h(x)=x仍然可能会带来性能问题。想象一下,您的数字是从0、2、4、…、2k中随机选择的,虽然是随机的,但假设两个桶大小的幂,它们都不会映射到哈希表的第一个桶(桶0)。因此,真正重要的是输入数字的信息熵


在您的例子中,一个很好的选择是Thomas Wang的整数散列函数,它是可逆的,并保持良好的雪崩效应()。有一篇文章描述了Thomas Wang的哈希函数及其逆函数:。

即使输入的数字是完全随机的,使用h(x)=x仍然可能会带来性能问题。想象一下,您的数字是从0、2、4、…、2k中随机选择的,虽然是随机的,但假设两个桶大小的幂,它们都不会映射到哈希表的第一个桶(桶0)。因此,真正重要的是输入数字的信息熵

出色的赵