我有一个排序的比率列表,我需要找到一个足够小的“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.
}
答案 0 :(得分:0)
只有改变:翻转阵列搜索以增加方向 - 许多架构更喜欢朝正方向发展。 (有些人没有。)没有证实我没有引入一个错误的错误。 (对不起。)
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]); }
答案 1 :(得分:0)
前进移动功能,解决了您遇到的一些逻辑问题。由于您正在寻找最小值,因此您的初始比较变量应从最大值开始。通过减法删除比较,因为您以后没有使用它,将其替换为除法。 注意:尚未测试边缘情况,包括零和负片。
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);
}