查找表是哈希表的一种形式吗?

时间:2012-09-19 19:14:10

标签: c++ c language-agnostic hashtable terminology

我试图看看我在概念上是否正确。 。

如果我试图避免为浮点数据someExpensiveFun(x)数组中的每个元素计算一个计算成本高的x,比如说限制在0到1之间的值,则可以先预先计算昂贵的功能的输出并将其存储在一个表中。 。 。

for (int nn = 0; nn < 1000; ++nn)
{
    float tmp = ((float)nn) / 1000.f;
    lookup[nn] = someExpensiveFun(tmp);
}

然后在我可以使用的性能关键代码的主体中。 。

y = lookup[(int)floor(x*1000.f)];

在概念上是否正确(而不是滥用术语)来调用lookup一种形式的哈希表和x*1000相关的散列函数?

5 个答案:

答案 0 :(得分:4)

不,在查询表中调用哈希表在概念上是不正确的:在您的情况下,查找表是一个简单的数组。在散列函数不完美的情况下(即在存在散列冲突的情况下),调用某个哈希表意味着某些行为;数组没有这种行为,因此将其称为“哈希查找”可能会误导您的听众或读者。

通常,任何类型的关联存储(包括哈希表,各种树等)都可用于执行查找操作。在您的情况下,数组的索引与存储在该索引处的值相关联,使您可以在恒定时间内查找该值。

答案 1 :(得分:4)

我个人认为这是滥用术语。它缺乏人们自然期望从哈希表中获得的属性,特别是能够对具有相等哈希值的非相等键执行某些操作。我非常确定您的“哈希函数”必须被视为floor(x*1000.f)(int)floor(x*1000.f),而不仅仅是x*1000.f

哈希表通常也可以接受键类型的任何值,而不仅仅是一个范围内的值,但也许我在那里太挑剔了。我不会调用一个不允许NaN作为键的“正常”哈希表,“不是哈希表”。

它有一些与哈希表相同的属性(一个将键映射到整数的非内射函数,表示整数用作数组中的索引)。如果有人想要决定这两个东西一起表征“哈希表”,好的,祝他们好运,这是一个哈希表: - )

答案 2 :(得分:2)

你倒退了。哈希表总是可以用作数组的缓慢替代,但是数组不能用作哈希表的替代(除非满足一些非常严格的前提条件)。

在您的情况下,查找甚至不会产生与计算相同的结果,只是近似。真正的哈希表可以区分散列到同一索引的不同输入。

答案 3 :(得分:1)

是的,如果您接受维基百科对hash table的定义。引用该定义:

Ideally, the hash function should map each possible key to a unique slot index,
but this ideal is rarely achievable in practice (unless the hash keys are fixed;
i.e. new entries are never added to the table after it is created).

您选择了一个数组,因为domain of your function定义良好且相对较小并且适合作为数组的索引 - 函数的域具有onto映射到索引的数组阵列。您可以将索引视为key hash table,函数输出是关联值。

答案 4 :(得分:1)

您可以使用哈希表替换所有查找表,但不能通过查找表替换所有哈希表。所以是的,查找表可以被认为是哈希表的特殊形式,哈希表可以被认为是查找表的一般形式。

以类似的方式,列表可以被认为是2D表的特殊形式(具有单个列)。

但是,我们在这里讨论的是软件。对于给定问题,存在大量不同的解决方案,以及构建数据结构的大量不同可能性。例如,具有静态大小或动态增长,具有所需的唯一条目或具有冲突处理,具有固定或可配置的散列函数等。在普通查找表和完整散列表之间有很多方法,没有明确的边界,你可以在这里说这是这个,但它已成为那个。

然而(再次),当一个特定的数据结构被证明是有用的时,它通常会得到它自己的名字。正如在这里所说的那样,有了这样的名称,就功能有了相关的期望。甚至可能对所需的最小功能有严格的定义。如果您希望其他人可以阅读您的代码,您最好坚持使用已知的术语。因此,您应该将查找表称为查找表,即使从技术上讲它是哈希表的特殊形式。