【问题标题】:Get Smallest Difference between Adjacent Array Elements in a Sorted List获取排序列表中相邻数组元素之间的最小差异
【发布时间】:2010-10-21 21:42:12
【问题描述】:

我有一个已排序的比率列表,我需要找到一个足够小的“bin 大小”,以免它们重叠。简而言之,我需要按照标题所说的去做。如果您想了解一些背景知识,请继续阅读。

我正在进行一个图形实验,该实验处理比率以及眼睛快速区分这些比率的能力。因此,当我们形成这些实验时,我们使用从点箱中选择的具有不同比率的点闪烁。一个 bin 只是一系列可能的比率,其中提到的数组元素位于中心。所有点箱的大小必须相同。这意味着我们需要在数组中找到彼此最近的元素。请记住,数组已排序。

谁能想到一个快速酷的方法来做到这一点?我从来没有特别倾向于算法,所以现在我只是向后遍历数组并从当前元素中减去下一个元素并检查它与总和。谢谢

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.
    }

【问题讨论】:

  • a 和 b 之间不是几何平均值sqrt(a*b)

标签: java arrays algorithm


【解决方案1】:

前移功能,修复了您遇到的一些逻辑问题。由于您正在寻找最小的双倍,因此您的初始比较变量应该从最大值开始。由于您以后没有使用它,所以通过减法删除了比较,将其替换为除法。 注意:尚未测试边缘情况,包括零和负数。

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);
}

【讨论】:

  • @kaskogu:寻找最小比率不等于寻找最小差异。规范要求最小的差异。但是,从 Double.MAX_VALUE 开始 min/result 是一个聪明的主意。
【解决方案2】:

唯一的改变:将数组搜索翻转为增加方向——许多架构更喜欢正方向。 (有些没有。)尚未验证我没有引入一个错误的错误。 (对不起。)

私人双findNumerostyBinRangeConstant(双[]比率){ int minI = 0; 双最小 = 双.MAX_VALUE; for (int i = 0; i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多