在Java中计算经过时间时接收NaN

时间:2013-11-23 21:44:01

标签: java binary-search

我正在编写一个程序,使用穷举搜索和二进制搜索来搜索英语词典。我必须打印出每个的平均值。 这是两者的代码。我真的不认为问题是find和findUsingBinarySearch本身。

public static double measureAverageExhaustiveSearchTime(String[] queries, String[] array){
    //Measures the average number of microseconds (µs) needed to find each query, using exhaustive search.
    long startTime = System.currentTimeMillis();
    for(int i = 0; i < queries.length; i++){
        find(queries[i], array);
    }
    long endTime = System.currentTimeMillis();
    double elapsedTime = (endTime - startTime);
    return (double)((elapsedTime/1000000000.0)/queries.length);
    }

   public static double measureAverageBinarySearchTime(String[] queries, String[] array){
    //Measures the average number of microseconds (µs) needed to find each query, using binary search.
    long startTime = System.nanoTime();
    for(int i = 0; i < queries.length; i++){
        findUsingBinarySearch(queries[i], array);
    }
    long endTime = System.nanoTime();
    double elapsedTime = (endTime - startTime);
    return (double)((elapsedTime/1000000000.0)/queries.length);

        //(double)(elapsedTime * 1000)/(queries.length);
}

我的输出只是:

执行搜索: NaN秒

二进制搜索: NaN秒

失败的搜索结果: NaN秒

失败的二进制搜索: NaN秒


当我使用更小的文件时,我得到了这个!

执行搜索: 0.0秒

二进制搜索: 2.1E-6秒

失败的搜索结果: 1.0E-10秒

失败的二进制搜索: 1.4E-6秒

以下是我如何使用字典作为两个参数调用方法,因为我试图测试数组二进制搜索本身需要多长时间。我还使用了一个字典副本,每个单词附加了“zzz”,以方便二进制和穷举搜索失败。

    System.out.println("EXHAUSTIVE SEARCH: ");
System.out.println(measureAverageExhaustiveSearchTime(dictionary, dictionary)+" seconds");
System.out.println("BINARY SEARCH: ");
System.out.println(measureAverageBinarySearchTime(dictionary, dictionary)+" seconds");         
System.out.println("FAILED EXHAUSTIVE SEARCH: ");
System.out.println(measureAverageExhaustiveSearchTime(dictionaryzzz, dictionary) + " seconds");
System.out.println("FAILED BINARY SEARCH: ");
System.out.println(measureAverageBinarySearchTime(dictionaryzzz, dictionary)+" seconds");

我不确定如何解决这个问题。

4 个答案:

答案 0 :(得分:1)

如果您尝试将毫秒转换为微秒,则应该乘以1000而不是除以。

您的measureAverageExhaustiveSearchTime代码:

return (double)((elapsedTime/1000000000.0)/queries.length);

这应该是:

return (double)((elapsedTime*1000.0)/queries.length);

此外,在解决startTime时,我会避免将endTimeelapsedTime长数据类型转换为double。尝试保持一种数据类型。数据类型转换有时会导致截断结果或意外的值。或

答案 1 :(得分:0)

您的查询数组似乎不包含任何元素。所以它是空的,其长度为零(0)。作为一种效果,你得到除以零,这导致Double.NaN

答案 2 :(得分:0)

NaN值用于表示某些无效操作的结果,例如除以 零到零。 float和double类型的NaN常量被预定义为 Float.NaNDouble.NaN。所以,问题显然是(elapsedTime/1000000000.0)/queries.length)和其他类似的陈述。

答案 3 :(得分:0)

阅读this文章。整篇文章对你非常有用,但这部分特别重要:

  

“NaN”代表“不是数字”。如果是浮点,则产生“Nan”   操作有一些输入参数导致操作   产生一些不确定的结果。例如,0.0除以0.0即   算术上未定义。取负数的平方根   也是未定义的。

现在,请调试您的代码并观察您的价值观,特别是在您的退货声明中。如果你可以在算术运算中看到异常,比如0除以0,那么这就是问题的根源。