【问题标题】:what is the good hash function for given situation?对于给定的情况,好的散列函数是什么?
【发布时间】:2012-06-21 06:04:45
【问题描述】:

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

【问题讨论】:

  • 您想将每个点散列到一个 int 中,这样它就可以为您提供与任何其他点的共线性?这似乎不可能。也许你的问题不是很清楚。
  • 我只使用每两个点计算所有可能的线,为此我计算斜率和它们的截距。如果任何两条线的斜率和截距相同,我可以说这些点是共线的。
  • 是的,但请看我的回答。您不能关联这些点,因为这会产生一些不需要的传递性。查看我的编辑。

标签: c++ algorithm hash hashmap hashtable


【解决方案1】:

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

另外,共线性是在点集上定义的,所以我上面的定义比较模糊。 IE。你不能说 A 和 B 是共线的(嗯,你可以,但是如果你只考虑两个点,每对点都是共线的)。

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

【讨论】:

  • 那么给我任何其他方法,以便我可以计算最大共线点数。
  • +1 用于应对给我代码的态度,你很勇敢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2017-10-15
    • 2012-02-09
    • 2015-10-10
    • 2011-12-03
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多