java - 二进制搜索不起作用 - 非数组。

标签 java search binary-search

我不确定这是我的公式还是我的思维过程有问题。这是 CodeAbbey 的一个练习,所以不是寻找具体答案,只是朝着正确的方向前进。

当涉及到数组时,我理解二进制搜索。在这里,我们试图用它来求解一个方程。这是示例:

A * x + B * sqrt(x ^ 3) - C * exp(-x / 50) - D = 0

这是我的公式,其中 mid 用作 x:

double result = (((a * mid) + (b * (Math.sqrt(Math.pow(mid, 3.0)))) - (c * (Math.exp(-mid / 50)) - d)));

这是他们给出的测试用例:

数据:

1
0.59912051 0.64030348 263.33721367 387.92069617

结果应该是:

73.595368554162

我认为这是我的公式。如果我插入那个结果,我不会像我假设的那样得到 0。

这就是为什么我从不退出 while 循环的原因。

package com.secryption.CA34BinarySearch;

import java.util.Scanner;

/**
 * Created by bmarkey on 11/11/2015.
 */

public class BinarySearch {
    public static void main(String[] args) {
        Scanner scanner1 = new Scanner(System.in);
        System.out.println("Enter Data: ");
        int testCases = scanner1.nextInt();

        for (int i = 0; i < testCases; i++) {
            double a = scanner1.nextDouble();
            double b = scanner1.nextDouble();
            double c = scanner1.nextDouble();
            double d = scanner1.nextDouble();
            boolean solved = false;

            double upperBound = (c + d) / (a + b);
            double lowerBound = 0;
            double mid;

            while (!(solved)) {

                mid = (upperBound + lowerBound) / 2.0;
                double result = ((a * mid) + (b * (Math.sqrt(Math.pow(mid, 3.0)))) - (c * (Math.exp(-mid / 50)) - d));

                if (result > 0) {
                    upperBound = mid;
                } else if (result < 0) {
                    lowerBound = mid;
                } else {
                    System.out.println(mid);
                    solved = true;
                }
            }
        }
    }
}

最佳答案

去掉多余的括号,您会发现 - d 项已错误地乘以 c 项。

您可能还需要与非常接近于零的值进行比较,因为在对此进行测试时我发现 result 变量由于浮点不准确而没有完全达到零,即:

if (Math.abs(result) < 1e-10) {
      System.out.println(mid);
      solved = true;
} else if (result > 0) {
      upperBound = mid;
} else if (result < 0) {
      lowerBound = mid;
}

关于java - 二进制搜索不起作用 - 非数组。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674829/

相关文章:

java - 找到字符串 s 的最长前缀,它是字符串 s 的反转子串

java - 对文件系统上的 XML 文件进行快速全文搜索。选择什么策略?

Python:搜索列表失败

ruby - 识别包含列表中每个字符的字符串

algorithm - 随机二分查找的期望运行时间

java - 如何在基本实体中定义通用主键字段?

java - 使用谓词过滤并发映射或列表(使用并行流)更快吗?

search - 更喜欢哪种搜索算法?

java - 为什么在二分查找中使用中间表达式的上限值是错误的?

java - 创建一个测试应用程序将名字、姓氏、用户名和密码存储到数据库中得到奇怪的结果