对于给定的情况,什么是好的哈希函数?

时间:2012-06-19 08:11:27

标签: c++ algorithm hash hashmap hashtable

在二维平面中给出了一个点,我想计算最大共线点,我计算了所有可能的线斜率及其截距。 为了解决这个问题,我尝试构建一个哈希表,但是我无法找到一个哈希函数,通过它我可以轻松地将所有共线点指向一个哈希键。那么请帮我找出适合这种情况的哈希函数吗?

2 个答案:

答案 0 :(得分:7)

这是不可能的,因为共线性不是传递性的。即,假设A B和C位于一条线上(即是共线的)。因此,A B和C应该获得相同的散列密钥。接下来,C D和E也位于另一条线上。因此,C D和E也应该获得相同的散列键。因此,A B接收与D和E相同的散列密钥,这是错误的,因为这些点不是共线的。

此外,共线性是根据几组来定义的,因此我的上述定义相当含糊。即你不能说A和B是共线的(好吧,你可以,但是如果你只考虑两点,那么每对点都是共线的。)

您可以做的是在哈希映射中保存共线点集。然后,良好的散列函数将简单地包括斜率s和纵坐标i。例如,您可以使用s * 31i。此哈希映射可用于向集合添加新点,并最终计算集合的大小以检索您的答案。

答案 1 :(得分:1)

您也可以考虑基于Hough Transform的算法。 霍夫变换允许您通过计算具有给定斜率和截距(或线与原点的角度和距离)的线中的点数来检测图像中的线。 因此,在您的特定情况下,您可以将每个距离/角度对的投票存储在二维矩阵中,然后从该矩阵中获取最大值。这将为您提供最大数量的共线点。 如果您允许近似值,那么您可以找到一个提供最大值总和的小矩形网格,而不是查找单个值。