将线分别分成任意长度的段。 (结尾处开头很短)

时间:2019-07-10 09:59:18

标签: java algorithm

假设有一行(1, 30)(浮点数x = 30) 我需要将其分成多个部分,每个下一个部分应比上一个部分宽,最后一个部分应比第一个部分宽X倍。

我有一个想法,首先将线分成相等的部分,然后增加,然后减少,直到达到两个条件: -第一段比最后一段短X倍 -对于同一乘数,每个分段(第一个分段除外)都比以前宽

    //input:
    int lineDimension = 30;
    int numberOfSegments = 5;
    int step = 1;

    float[] splitLineIntoSegments(float lineDimension, int numberOfSegments, float differenceBetweenFirstAndLastSegmentMultiplicator, float step) {
      float[] result = new float[numberOfSegments];
      //first split into equal segments
      for (int i = 0; i < numberOfSegments; i++) {
        result[i] = lineDimension / numberOfSegments;
      }
      //increase each next value untill difference reached
      do {
        for (int ii = 0; ii < numberOfSegments; ii++) {
          if (result[ii]-step<=0)
            return result;
            if (ii>numberOfSegments/2){
              result[ii] += step;
            }
            else result[ii] -= step;
        }
      }
      while ((float)result[numberOfSegments] / (float)result[0] > differenceBetweenFirstAndLastSegmentMultiplicator);

      return result;
    }

float [] res = splitLineIntoSegments(lineDimension,numberOfSegments,2,step);

其结果应为4,5,6,7,8

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

如果比率必须恒定,则让r,各段的相对长度为1r,…{ {1}}个r^(n-1)部分,总和为n。我们也有(r^n-1) / (r-1),给出X = r^(n-1)

如果线段的长度为r = X^(1/(n-1)),则部分为

L

例如对于L.r^k.(r-1) / (r^n-1) 部分和4,我们有X=27/8,部分是r=3/28/6512/6518/65 27/65


如果比率不必恒定且各部分与某些给定数字L(例如Rk)成比例,则取总和X=R[n-1]/R0并使用

R

答案 1 :(得分:0)

您可以为此强制一个简单的算术序列。 从问题参数开始:

N = quantity of segments
X = scale factor: segment[N-1] / segment[0]
L = length of line

首先,找到所需的均值:

mean = L / N

现在,我们需要第一个和最后一个项才能求平均值。令a为当前未知的第一段的长度。解决a

(a + X*a) / 2 = mean
 a = 2*mean / (1+X)

您现在有了第一个(a)和最后一个(X*a)术语,以及术语数量。现在,找到共同的区别很简单:

d = (X*a - a) / (N-1)

您的细分顺序现在是

[ a + i*d for 0 <= i < N ]    // i being a sequence of integers