Floating point 流行的浮点二和算法问题

Floating point 流行的浮点二和算法问题,floating-point,rounding,Floating Point,Rounding,有一个流行的算法问题称为二和。对于那些不知道的人,这里有一个快速的描述。您将获得一个包含n个元素的数字数组和一个目标数字。你应该在数组中找到2个数字,这样它们加起来就是目标数字 这个问题可以在Leetcode上找到 数组中的数字通常以整数形式给出。这是我的问题。如果数组中填充的是浮点数,那么如何解决这个问题呢?由于舍入误差,这个问题更加困难 我认识到这是一个相当普遍的问题陈述。例如,这个问题的解决方案实际上取决于目标数是限制为整数还是也可以是浮点数。我认为为了使这个问题有意义,目标数必须限制为

有一个流行的算法问题称为二和。对于那些不知道的人,这里有一个快速的描述。您将获得一个包含n个元素的数字数组和一个目标数字。你应该在数组中找到2个数字,这样它们加起来就是目标数字

这个问题可以在Leetcode上找到

数组中的数字通常以整数形式给出。这是我的问题。如果数组中填充的是浮点数,那么如何解决这个问题呢?由于舍入误差,这个问题更加困难

我认识到这是一个相当普遍的问题陈述。例如,这个问题的解决方案实际上取决于目标数是限制为整数还是也可以是浮点数。我认为为了使这个问题有意义,目标数必须限制为整数(如果我错了,请纠正我)。然而,除此之外,对于这个问题,处理舍入错误可以采用哪些一般思路/技术?

查找浮点和 如果问题是找到两个数组元素x和y,当使用浮点运算时,它们的和就是目标数z,那么浮点舍入问题在很大程度上是无关的

二和问题的一个算法是:

  • 对元素进行排序。(要记住数组中的原始索引,请将元素与其索引关联,并在排序时保留这些关联。)
  • L
    设置为指向最低元素,将
    H
    设置为指向最高元素
  • 当L早于H时:
    • 如果
      *L
      (由
      L
      指向的数字)和
      *H
      之和为z,则停止。所需元素为
      *L
      *H
    • 如果总和小于z,则前进
      L
    • 如果总和大于z,则减小
      H
  • 停下来。没有解决办法
  • 浮点舍入不是问题,因为浮点加法是(弱)单调的:如果x0的浮点和小于x1,那么x0和y的浮点和小于或等于x=1和y的浮点和。这意味着算法中
    *L
    *H
    的测试和总是正确地指示是否必须调整
    L
    H
    以继续搜索如果测试和太低,那么我们需要一个更高的数字,因此
    L
    必须提前。同样,如果测试和太高,
    H
    必须减小。这样做就不会错过任何解决方案

    求实数和 如果问题是找到两个数组元素x和y,这样当使用实数运算时,求和就是目标数z,那么上述算法只需对测试进行简单修改即可

    替换步骤3。以上与:

    • 评估
      s=*L+*H;z=s-*L;t=*H-z。然后,在实数算术中,
      s
      +
      t
      正好是
      *L
      +
      *H
      .1
      s
      包含总和的最重要部分(可用浮点表示的最近值),和
      t
      包含
      s
      *L
      *H
      的实数和的误差或偏差。如果
      s
      等于z且
      t
      等于零,则停止。所需元素为
      *L
      *H
    • 如果
      s
      s=z和
      t
      <0,则前进
      L
    • 否则,减小
      H
    脚注
    1 Muller等人,《浮点运算手册》,2010年,定理4,第126-129页。

    您可能需要补充一些关于使用
    target-*H
    之类的工具来检查错误匹配的内容。这很公平。但是,由于OP没有指定这一点(并且确实提到了处理舍入错误),因此提及该选项可能会很有用。如果您希望达到60,但您的数字为1E20,则情况如何。你将如何处理这个问题?@kvantour:算法是有效的。您询问的情况与目标为60但整数数量级为1000000的整数列表有什么不同?如果没有一对的和为60,算法将确定这一点。如果有一对,算法会找到它。@Sneftel:事实证明,测试实数和并修改算法以找到精确匹配是很容易的。我更新了答案。如果您使用哈希表进行求解,您可能需要添加一些额外的哈希。这些可能是每个条目的两个额外浮动(下一个和上一个浮动到列出的浮动)。这样可以克服舍入误差。可能很方便