2013-11-23 56 views
0

我正在編寫一個程序,該程序使用窮舉搜索和二分搜索搜索英文詞典。我必須打印每個的平均值。 這是兩者的代碼。我真的不認爲這個問題是find和findUsingBinarySearch本身。在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); 
} 

我的輸出就是:

窮舉搜索: 的NaN秒

二進制搜索: 的NaN秒

失敗窮舉搜索: 的NaN秒

失敗的二進制搜索: NaN秒


當我使用一個更小的文件,我得到了這個!

窮舉搜索: 0.0秒

二進制搜索: 2.1E-6秒

FAILED窮舉搜索: 1.0E-10秒

FAILED二進制搜索: 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

查詢[]是否可能是空數組? – FuzzyBunnySlippers

+0

對不起,我沒有足夠的上下文。在我的主要方法中,我將我的字典中的平均窮舉/二進制搜索方法稱爲搜索字典中的每個單詞。 :) – raine

+0

這個'/ queries.length'的值是什麼? (我不是說它有什麼好處,但是什麼是'長度'?) –

回答

1

如果您嘗試從毫秒轉換爲微秒,那麼您應該將乘法而不是除法乘以1000。

你measureAverageExhaustiveSearchTime代碼:

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

這應該是:

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

而且我會避免通過求解elapsedTime當鑄造這雙轉換startTimeendTime長的數據類型。儘量保持一種數據類型。數據類型轉換有時會導致結果被剔除,或者數據的意外地層。

+0

+1最可能的是query.length爲0,0.0/0.0爲NaN。 –

+0

它應該是'elapsedTime/1000.0'以秒爲單位。 –

0

看來你的查詢數組不包含任何元素。所以它是空的,它的長度是零(0)。作爲效果你獲得由零的除法,這導致Double.NaN

+0

查詢數組確實包含元素(據我所知),它應該包含整個字典或拙劣的「zzz」字典(dictionaryzzz) – raine

+0

在任何情況下,您都應該在方法開始時進行空檢查以確保。 – isnot2bad

+0

「空支票」?我不知道這意味着什麼。 – raine

0

NaN值用於表示某些無效操作,例如的除以零 由零結果。 NaN float和double類型的常量被預定義爲 Float.NaNDouble.NaN。所以,這個問題顯然與(elapsedTime/1000000000.0)/queries.length)等聲明有關。

0

閱讀this文章。整篇文章對你來說非常有用,但這一部分尤其重要:

「NaN」代表「不是數字」。如果浮點操作有一些輸入參數導致操作產生一些未定義的結果,則產生「南」。例如,0.0除以0.0就是 在算術上未定義。取一個負數 的平方根也是未定義的。

現在,請調試您的代碼並觀察您的值,特別是在您的退貨聲明中。如果你可以在算術運算中看到不尋常的東西,比如0除以0,那麼這就是問題的根源。