2013-11-23 3 views
0

Я пишу программу, которая ищет через английский словарь, используя как исчерпывающий, так и двоичный поиск. Я должен распечатать средние значения каждого из них. Вот код для обоих. Я действительно не думаю, что проблема заключается в поиске и findUsingBinarySearch.Получение NaN при вычислении прошедшего времени в Java

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 секунды

FAILED переборные: NaN секунды

FAILED бинарного поиска : 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'? (Я не имею в виду, что это хорошо, но что такое 'length'?) –

ответ

1

Если вы пытаетесь конвертировать из миллисекунд в микросекунды, вы должны умножать вместо деления на 1000.

Ваш код measureAverageExhaustiveSearchTime:

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

Это должно быть:

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

Кроме того, я хотел бы избежать превращений startTime и endTime длинных типов данных литья это двойной при решении для elapsedTime. Попытайтесь остаться в одном типе данных. Конверсии типов данных иногда приводят к отрублению результатов или неожиданному настилу значений.

+0

+1, скорее всего, длина запроса равна 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.NaN и Double.NaN. Таким образом, проблема, очевидно, связана с (elapsedTime/1000000000.0)/queries.length) и другими подобными утверждениями.

0

Прочитано this артикул. Вся статья будет чрезвычайно полезна для вас, но эта часть особенно важна:

«NaN» означает «не число». «Нан» создается, если операция с плавающей запятой имеет некоторые входные параметры, которые вызывают операцию , для получения некоторого неопределенного результата. Например, 0.0, деленное на 0.0, равно , арифметически не определено. Принимая квадратный корень отрицательного числа также не определено.

Теперь отсканируйте свой код и посмотрите свои значения, особенно в своем заявлении о возврате. Если вы можете увидеть что-то необычное в ваших арифметических операциях, например 0, деленное на 0, то это корень проблемы.

Смежные вопросы