2010-10-21 56 views
0

我有一個排序的比率列表,我需要找到一個足夠小的「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. 
    } 
+0

a和b'sqrt(a * b)'之間的幾何平均數不是幾何平均數? – JoshD 2010-10-21 21:47:01

回答

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]); 
    } 
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); 
} 
+0

@kaskogu:搜索找到最小比率不等於搜索找到最小差異。規範「要求最小的差異。但是,在Double.MAX_VALUE開始分鐘/結果是一個聰明的想法。 – 2010-10-21 23:48:00

相關問題