"哈希函数找到包含P&#34中最大点数的行;

时间:2017-02-20 06:29:12

标签: algorithm c++11 hashmap hashtable

以下是Elements of Programming Interviews书中的段落:

  

设P是平面中的n个点的集合。每个点都有整数   坐标。设计一种计算线路的有效算法   包含P中的最大点数。

在解决方案部分中说:

 Every pair of distinct points defines a line. We can use a hash table
H to map lines to the set of points in P that lie on them.

这是Line

的哈希函数
// Hash function for Line.
struct HashLine {
   size_t operator()(const Line& l) const {
       return hash <int >()(l.slope.first) ^ hash <int >()(l.slope.second) ^ hash <int >()(l.intercept.first) ^ hash <int >()(l.intercept.second);
}

这是坡度和拦截的声明:

 pair <int, int> get_canonical_fractional(int a, int b) {
    int gcd = GCD(abs(a), abs(b));
    a /= gcd, b /= gcd;
    return b < 0 ? make_pair(-a, -b) : make_pair(a, b);
 }

     // Line function of two points , a and b, and the equation is
     // y = x(b.y - a.y) / (b.x - a.x) + (b.x * a.y - a.x * b.y) / (b.x - a.x).
     struct Line {
     Line(const Point& a, const Point& b)
     : slope(a.x != b.x ? get_canonical_fractional(b.y - a.y, b.x - a.x) : make_pair(1, 0))
     , intercept(a.x != b.x ? get_canonical_fractional(b.x * a.y - a.x * b.y,  b.x - a.x) : make_pair(a.x, 1))
     {}

       ...
     // Store the numerator and denominator pair of slope unless the line is
     // parallel to y-axis that we store 1/0.  
     pair <int, int> slope;
     // Store the numerator and denominator pair of the y-intercept unless
     // the line is parallel to y-axis that we store the x-intercept.     
     pair <int, int> intercept;
};

但我们怎么知道如果斜率和截距对是唯一的,那么它们的xor仍然是唯一的?

1 个答案:

答案 0 :(得分:1)

我们可以尝试以下简单的算法:

  1. 创建哈希映射,使用键作为行的(slope, intercept)对,将值作为具有相同斜率截距的行数。
  2. 对于所有点对(O(n^2)对)计算(slope, intercept)值并增加hashmap中的相应键(在最坏的情况下,它会消耗O(n^2)内存但是如果有是很多共线点,那么平均空间复杂度应该很低。)
  3. 输出行,即在散列映射中具有最高计数的(slope, intercept)(为此,您需要遍历hasmap,在最坏的情况下将包含O(n^2)个条目)。