我正在解决Cracking The Coding Interview中的一个问题,问题是:给定一个带有点的二维图,找到一条通过最多点数的线。
解决方案是:在每两个点之间绘制一条无穷大的线,并使用哈希表跟踪哪条线最常见。为了找到最常见的线,我们使用哈希表迭代所有线段,以计算我们看到每一行的次数。
作者继续说有一个复杂因素:“如果线条具有相同的斜率和y截距,我们将两条线定义为相等。此外,我们根据这些值对线条进行散列(具体而言)浮点数的问题不能总是用二进制来精确表示。我们通过检查两个浮点数是否在彼此的epsilon值内来解决这个问题。“
这是我困惑的地方。即使斜率是浮点数,我们也不能将其用作散列键?如果是这样,为什么不将斜率作为字符串散列呢?为什么我们需要根据彼此epsilon中的键引入代码哈希?
答案 0 :(得分:-1)
看看下面用c ++编写的例子。
#include <stdio.h>
#include <stdlib.h>
int main() {
double a=10.0;
double b=a/3;
double c=(b-3)*3;
printf("a: %20.50lf\n", a);
printf("b: %20.50lf\n", b);
printf("c: %20.50lf\n", c);
return 0;
}
'c'应该等于1但是由于浮点舍入,上面的代码产生以下内容。
a: 10.00000000000000000000000000000000000000000000000000
b: 3.33333333333333348136306995002087205648422241210938
c: 1.00000000000000044408920985006261616945266723632812
答案 1 :(得分:-1)
您描述的算法不需要任何哈希表。
改用直方图。本答案是 C ++
中此任务的确切示例如果您仍想使用浮动键作为键
然后你需要截断它们,以便它们可以比较为二进制。例如,假设你有(假设 C ++ 语法):
const float da=1.5*M_PI/180.0; // [rad] comparison precision
float a;
a=atan2(dy,dx); // [rad] your line angle from deltas
a=floor(a/da); // [da] truncated angle
dx,dy
是您的行增量,da
是您的比较精度角度。现在,要以哈希的方式访问float a
作为二进制文件,您只需执行此操作:
union { float f32; DWORD u32; } b;
b.f32=a;
// here b.u32 is your hash key