我正在编写一个程序,使用穷举搜索和二进制搜索来搜索英语词典。我必须打印出每个的平均值。 这是两者的代码。我真的不认为问题是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");
我不确定如何解决这个问题。
答案 0 :(得分:1)
如果您尝试将毫秒转换为微秒,则应该乘以1000而不是除以。
您的measureAverageExhaustiveSearchTime代码:
return (double)((elapsedTime/1000000000.0)/queries.length);
这应该是:
return (double)((elapsedTime*1000.0)/queries.length);
此外,在解决startTime
时,我会避免将endTime
和elapsedTime
长数据类型转换为double。尝试保持一种数据类型。数据类型转换有时会导致截断结果或意外的值。或
答案 1 :(得分:0)
您的查询数组似乎不包含任何元素。所以它是空的,其长度为零(0)。作为一种效果,你得到除以零,这导致Double.NaN
,
答案 2 :(得分:0)
NaN
值用于表示某些无效操作的结果,例如除以
零到零。 float和double类型的NaN
常量被预定义为
Float.NaN
和Double.NaN
。所以,问题显然是(elapsedTime/1000000000.0)/queries.length)
和其他类似的陈述。
答案 3 :(得分:0)
阅读this文章。整篇文章对你非常有用,但这部分特别重要:
“NaN”代表“不是数字”。如果是浮点,则产生“Nan” 操作有一些输入参数导致操作 产生一些不确定的结果。例如,0.0除以0.0即 算术上未定义。取负数的平方根 也是未定义的。
现在,请调试您的代码并观察您的价值观,特别是在您的退货声明中。如果你可以在算术运算中看到异常,比如0除以0,那么这就是问题的根源。