Получите наименьшую разницу между соседними элементами массива в отсортированном списке - PullRequest
0 голосов
/ 22 октября 2010

У меня есть отсортированный список соотношений, и мне нужно найти «размер корзины», который достаточно мал, чтобы ни один из них не перекрывался.Короче говоря, мне нужно сделать то, что говорит название.Если вам нужен небольшой фон, читайте дальше.

Я работаю над графическим экспериментом, который касается соотношений и способности глаза быстро различать эти соотношения.Поэтому, когда мы формируем эти эксперименты, мы используем вспышки точек с различными соотношениями, выбранными из наборов точек.Бин - это просто диапазон возможных соотношений с упомянутыми элементами массива в центре.Все точки должны быть одинакового размера.Это означает, что нам нужно найти элементы в массиве, которые являются ближайшими друг к другу.Имейте в виду, что массив отсортирован.

Кто-нибудь может придумать быстрый крутой способ сделать это?Я никогда не был особенно склонен к алгоритму, поэтому сейчас я просто пробегаю массив в обратном направлении, вычитая следующий элемент из текущего и проверяя его на сумму.Спасибо

private double findNumerostyBinRangeConstant(double[] ratios) {
        int minI = 0;
        double min = 0;
        for (int i = ratios.length -1; i > 0; i--) {
            if (ratios[i] - ratios[i-1] > min) {
                min = ratios[i] - ratios[i-1];              
                minI = i;
            }
        }
        return Math.sqrt(ratios[minI]/ratios[minI - 1]); //Essentiall a geometric mean. Doesn't really matter.
    }

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Функции продвижения вперед, исправлены некоторые логические проблемы, которые у вас были. Поскольку вы ищете минимальное значение double, ваша начальная переменная сравнения должна начинаться с max. Убрал сравнение вычитанием, потому что вы не использовали его позже, заменил его делением. Примечание. Не проверял крайние случаи, включая нули и негативы.

private double findNumerostyBinRangeConstant(double[] ratios) {
    double result = Double.MAX_VALUE;
    for (int i = 0; i<ratios.length-1; i++) {
        if (ratios[i+1]/ratios[i] < result){
            result = ratios[i+1]/ratios[i];
        }
    }
    return Math.sqrt(result);
}
0 голосов
/ 22 октября 2010

Только изменение: перевернул поиск по массиву, чтобы идти в возрастающем направлении - многие архитектуры предпочитают идти в положительном направлении.(Некоторые этого не делают.) Не подтвердили, что я не вводил ошибку «один за другим».(Извините.)

private double findNumerostyBinRangeConstant(double[] ratios) {
        int minI = 0;
        double min = Double.MAX_VALUE;
        for (int i = 0; i <= ratios.length-1; i++) {
            if (ratios[i+1] - ratios[i] < min) {
                min = ratios[i+1] - ratios[i];              
                minI = i;
            }
        }
        return Math.sqrt(ratios[minI+1]/ratios[minI]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...