Java 获取排序列表中相邻数组元素之间的最小差异
我有一个分类的比率列表,我需要找到一个足够小的“箱子大小”,这样它们就不会重叠。简而言之,我需要按照标题所说的去做。如果你想了解一些背景知识,请继续阅读 我正在做一个图形实验,研究比率和眼睛快速区分这些比率的能力。所以,当我们进行这些实验时,我们使用从点仓中选择的不同比率的点的闪光。一个箱子只是一系列可能的比率,上面提到的数组元素位于中间。所有的点仓大小必须相同。这意味着我们需要在数组中找到彼此最近的元素。请记住,数组已排序 有人能想出一个快速而酷的方法来做这件事吗?我从来没有特别倾向于算法,所以现在我只是向后运行数组,从当前元素中减去下一个元素,然后根据总和检查。谢谢Java 获取排序列表中相邻数组元素之间的最小差异,java,arrays,algorithm,Java,Arrays,Algorithm,我有一个分类的比率列表,我需要找到一个足够小的“箱子大小”,这样它们就不会重叠。简而言之,我需要按照标题所说的去做。如果你想了解一些背景知识,请继续阅读 我正在做一个图形实验,研究比率和眼睛快速区分这些比率的能力。所以,当我们进行这些实验时,我们使用从点仓中选择的不同比率的点的闪光。一个箱子只是一系列可能的比率,上面提到的数组元素位于中间。所有的点仓大小必须相同。这意味着我们需要在数组中找到彼此最近的元素。请记住,数组已排序 有人能想出一个快速而酷的方法来做这件事吗?我从来没有特别倾向于算法,所
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.
}
唯一的变化是:将数组搜索转向递增方向——许多架构更倾向于正向搜索。(有些人没有)还没有验证我没有引入一个off-by-one错误。(对不起。) 专用双FindNumerostyBinRangeContent(双[]比率){ int minI=0; 双最小值=双最大值;
对于(int i=0;i前移函数,修复了您遇到的一些逻辑问题。由于您正在寻找最小双精度,您的初始比较变量应该从最大值开始。通过减法删除比较,因为您以后没有使用它,将其替换为除法。 注:未测试边缘情况,包括零和负片
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);
}
private双findNumerostyBinRangeConstant(双[]比率){
双重结果=双重最大值;
对于(inti=0;iIsn不是a和b之间的几何平均值sqrt(a*b)
?@kaskogu:搜索最小比率并不等于搜索最小差异。规范要求最小差异。但是,从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);
}