编写二进制搜索程序的问题

时间:2013-07-12 18:50:09

标签: java debugging binary-search

我是一名初学程序员,正在尝试编写一个简单的二进制搜索程序。几天后我已经搞乱了这个程序,但没有任何运气让它运行应该。当我尝试在java中编译程序时,我不断得到错误double不能被解除并且可能会丢失精度。非常感谢您提供的任何帮助。

有问题的节目就在下面。 (我已经使用了我所拥有的一本书中的例子,但即使我没有能够使它工作得很好)有人说我应该告诉确切的错误而且它们是双重的不能解除if( a[ mid ].compareTo( x ) < 0 )和double无法解除引用else if( a[ mid ].compareTo( x ) > 0)

编辑:我收到了一些帮助,并将一些双打更改为整数

public class Search
{
    public static final int NOT_FOUND = -1;
    public static double binarySearch(double[] a , double x)
    {
        int low=0;
        int high = a.length -1;
        int mid;
        while( low <= high )
        {
            mid = ( low + high ) / 2;

            if( a[ mid ].compareTo( x ) < 0 )
                low = mid + 1;
            else if( a[ mid ].compareTo( x ) > 0)
                high = mid - 1;
            else 
                return mid;
        }
        return NOT_FOUND;
    }

    public static void main( String[] args)
    {
        int SIZE = 6;
        double[] a = {-3,10,5,24,45.3,10.5};
        for (int i= 0; i<SIZE ; i++)
        a[i] = new Integer(i *2);
        for (int i= 0; i<SIZE*2; i++)
            System.out.println("Found" + i + " at " + binarySearch(a, 45.3 ));
    }
}

2 个答案:

答案 0 :(得分:4)

您正在使用double low和朋友来引用数组中的索引。您需要使用int来获取此信息。

int low = 0;
int high = a.length - 1;
int mid;

你也在这里覆盖你的价值观:

double[] a = {-3,10,5,24,45.3,10.5};
for (int i= 0; i<SIZE ; i++)
    a[i] = new Integer(i *2);

您从a开始,其值为-3, 10, 5...,但您会立即在for循环中用0, 2, 4 ...覆盖它们。我不确定为什么......

但那些只是旁注。它不会编译的原因是你试图在compareTo()上使用double - 现在它应该是自动装箱,但无论出于什么原因它都不是。因此,您需要使用Double.compare(a[low],x)。它还具有保存对象创建的额外好处。

答案 1 :(得分:1)

double cannot be dereferenced来自“我不确定它是如何实现这一目标的”Integer s。

首先,您将a声明为double[]。然后,您将a中的每个值指定为Integer。我猜这种语言可能会透明地将它转换为双倍,但我不确定那个。

您的错误来自您撰写a[ mid ].compareTo( x )的部分。 adouble[]。因此,a[mid]doubledouble不是对象,因此不能“解除引用”。使用.compareTo()方法正是这样做的。它类似于写9.compareTo(7)

我建议不要在这种情况下使用IntegerDouble类,只使用直接算术:

        if( a[ mid ] < x )
            low = mid + 1;
        else if( a[ mid ] > x)
            high = mid - 1;

至于你的主循环,试试

public static void main( String[] args)
{
    int SIZE = 6;
    double[] a = {-3,5,10,10.5,24,45.3};

    System.out.println("Found 45.3 at " + binarySearch(a, 45.3 ));
}

虽然您需要对二进制搜索进行排序(如我手工或用sort()方法所做),以便正常工作。