Algorithm 完全哈希时间复杂度

Algorithm 完全哈希时间复杂度,algorithm,hash,Algorithm,Hash,完美散列是否会在0(1)次内删除、插入和搜索?如果是这样的话,为什么计算机科学家不一直使用完美散列呢?如果不是的话,时间复杂度是多少 完美散列是否会在0(1)次内删除、插入和搜索 是的,因为只有一个元素。所以你可以得到尽可能多的存储桶 如果是这样的话,为什么计算机科学家不一直使用完美散列呢?如果不是的话,时间复杂度是多少 原因之一是理论上的。 完美散列函数是内射函数,如果不是不可能的话,定义这样一个函数可能会很困难 考虑以下琐碎的结构: { int x; int y; } 基本上,您希

完美散列是否会在0(1)次内删除、插入和搜索?如果是这样的话,为什么计算机科学家不一直使用完美散列呢?如果不是的话,时间复杂度是多少

完美散列是否会在0(1)次内删除、插入和搜索

是的,因为只有一个元素。所以你可以得到尽可能多的存储桶

如果是这样的话,为什么计算机科学家不一直使用完美散列呢?如果不是的话,时间复杂度是多少

原因之一是理论上的。 完美散列函数是内射函数,如果不是不可能的话,定义这样一个函数可能会很困难

考虑以下琐碎的结构:

{
  int x;
  int y;
}
基本上,您希望让您的
hash()
函数为每个可能的x和y值提供唯一的结果,这可能是不可能的。基本上,对于像
x+y
x*y
x^y
这样的琐碎输入,您总是可以创建另一个可以给出相同结果的输入

另一方面,这是可能的(如
|N^2 |=|N |=aleph null
)-请参阅


另一个原因是实用的——您的返回函数必须有一个返回类型。返回类型需要能够存储所有可能的注入结果-因此对于两个32位值的哈希,需要64位,对于三个3*32等(比较上述配对函数有效地乘以参数)

用于非平凡范围的实用完美哈希函数要求提前知道所有密钥。显然,这不适合大多数哈希函数用例。不太完美的香草散列函数通常在很大范围的负载因子上具有O(1)性能,因此完美的优势是最小的。引用维基百科:这是否是唯一的多项式配对函数仍然是一个悬而未决的问题。你的两个理由似乎是要么,而不是两者(除非我误解了)-如果散列中的位数与输入的位数相同(或大于输入的位数)(这似乎是最后一段所讨论的内容),那么只使用输入作为散列是很简单的,这将是一个完美的散列函数(尽管,暗示您还需要一个足够大的散列表)。如果你试图用更少的比特来表示它,那么第一个问题就出现了。非常好!我们可以说sizeof(output)=sizeof(input)=product(sizeof(arg[i])。如果可以满足这一点(一般来说,java的
hashCode
方法返回
int
),那么我们可以使用配对函数。如果您有一个用于N个输入的完美哈希函数,则需要log(N)位来寻址表。假设您可以独立于N计算输入的log(N)位哈希,这是一个非常字符串的假设!