2013-11-23 2 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 초

실패 BINARY 검색 : NaN 초


훨씬 작은 파일을 사용했을 때 나는 이것을 얻었다!

철저한 SEARCH : 0.0 초

BINARY SEARCH : 2.1E-6 초

FAILED 철저한 SEARCH : 1.0E-10 초

BINARY SEARCH 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

queries []가 빈 배열 일 수 있습니까? – 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입니다. 효과로서 당신은 NaN 값이 0으로 제로 나눔 등 특정 잘못된 연산의 결과를 나타내는 데 사용된다

+0

쿼리 배열에는 (내가 아는 한) 요소가 포함되어 있습니다. 전체 사전이나 손상된 "zzz"사전 (dictionaryzzz)이 포함되어 있어야합니다. – raine

+0

어쨌든 메소드 초기에 빈 체크가 있어야합니다. . – isnot2bad

+0

"빈 검사"? 그게 무슨 뜻인지 모르겠다. – raine

0

Double.NaN 결과 0으로 나누기를 얻는다. NaN float 및 double 유형의 상수는 Float.NaNDouble.NaN으로 미리 정의됩니다. 따라서 문제는 분명히 (elapsedTime/1000000000.0)/queries.length) 및 기타 이와 같은 진술로 나타납니다.

0

this을 읽으십시오. 전체 기사는 매우 유용하지만이 부분은 특히 중요합니다.

"NaN"은 "숫자가 아닙니다"를 나타냅니다. "Nan"부동 소수점 작업에 일부 입력 매개 변수가있어 에 대한 연산이 정의되지 않은 결과를 생성하는 경우 생성됩니다. 예를 들어 0.0을 0.0으로 나눈 값은 입니다. 음수 인 의 제곱근을 취하는 것은 정의되지 않습니다.

이제 코드를 디버그하여 값을 확인하십시오. 특히 return 문을 사용하십시오. 0으로 나눈 0처럼 산술 연산에서 이상한 것을 볼 수 있다면 문제의 근원이됩니다.

관련 문제