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



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

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);
}

我的输出只是:

详尽搜索:纳N秒

二叉搜索:纳N秒

穷举搜索失败:纳N秒

二叉搜索失败:纳N秒


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

详尽搜索: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");

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

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

您的度量平均详尽搜索时间代码:

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

这应该是:

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

此外,我将避免转换startTimeendTime长数据类型,方法是在求解elapsedTime时将其转换为双精度。尽量保持一种数据类型。数据类型转换有时会导致结果被切断,或值的意外下限。

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

NaN值用于表示某些无效操作的结果,例如除法零对零。 浮点型和双精度型NaN常量预定义为 Float.NaNDouble.NaN .因此,问题显然出在(elapsedTime/1000000000.0)/queries.length)和其他此类声明上。

阅读这篇文章。整篇文章对您非常有用,但这部分尤其重要:

">

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

现在,请调试您的代码并观察您的值,尤其是在您的 return 语句中。如果你在算术运算中看到一些不寻常的东西,比如 0 除以 0,那么这就是问题的根源。

最新更新