二进制

时间:2017-01-31 02:28:56

标签: algorithm hash binary floating-point key

我正在解决Cracking The Coding Interview中的一个问题,问题是:给定一个带有点的二维图,找到一条通过最多点数的线。

解决方案是:在每两个点之间绘制一条无穷大的线,并使用哈希表跟踪哪条线最常见。为了找到最常见的线,我们使用哈希表迭代所有线段,以计算我们看到每一行的次数。

作者继续说有一个复杂因素:“如果线条具有相同的斜率和y截距,我们将两条线定义为相等。此外,我们根据这些值对线条进行散列(具体而言)浮点数的问题不能总是用二进制来精确表示。我们通过检查两个浮点数是否在彼此的epsilon值内来解决这个问题。“

这是我困惑的地方。即使斜率是浮点数,我们也不能将其用作散列键?如果是这样,为什么不将斜率作为字符串散列呢?为什么我们需要根据彼此epsilon中的键引入代码哈希?

2 个答案:

答案 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)

  1. 您描述的算法不需要任何哈希表。

    改用直方图。本答案是 C ++

    中此任务的确切示例
  2. 如果您仍想使用浮动键作为键

    然后你需要截断它们,以便它们可以比较为二进制。例如,假设你有(假设 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