-1

我有一个数字列表,例如 1 到 60,但不一定以 1 为增量。例如,1-40 以 1 为增量,40-60 以 2 为增量。

我有另一组定义的数字(桶)——例如 2、3、5、10、30、50

我需要生成一个二维数组,其中每个数字(1 到 60)适合哪个桶的百分比。

让这更简单:假设我们有数字 1 到 10,以及桶 2、3、5、10

我希望我的二维数组看起来像这样:

在此处输入图像描述

我可以用一堆条件来做到这一点,但我认为有一个我没有想到的解决方案,如果有人能阐明一下,那就太好了!我需要在 JavaScript 中执行此操作,但是任何语言都可以帮助我尝试理解任何比许多 if 决定每个数字适合的位置然后为每个单元格执行 (6-5/10-5)=0.2 更优化的解决方案。

我试图避免对存储桶 2、3、5、10 进行硬编码,以便任何一组存储桶或数字都可以完成这项工作。

编辑: 首先,对于不完整的描述,我很抱歉 - 我当时在手机上,无法通过计算机在 stackoverflow 上发帖。

1-10 和 2,3,5,10 都代表年份。实际上,我试图每年从 1 到 10。

  • 第 1 年 100% 进入 Bucket 2 - 我想这个单元格没有特定的公式
  • 第 2 年 100% 进入 Bucket 2 - 也没有具体公式
  • 第 3 年 100% 进入存储桶 3 - 3==3
  • 第 4 年在存储桶 3 之间分配一半,在存储桶 5 之间分配一半。计算公式为:(第 4 年 - 第 3 年)/(第 5 年 - 第 3 年)= 0.5
    • 第 5 年 100% 进入存储桶 5。
    • 第 6 年,80% 进入桶 5,20% 进入桶 10。这个公式是:1-(6-5)/(10-5)=0.8 和它的相邻单元格 (6-5)/( 10-5)
    • ...等等...

我希望这能让它更清楚。

4

1 回答 1

1

你可以做这样的事情。它完全按照您在帖子中要求的格式:

function bucketize(numberList, buckets) {
    // buckets must contain values sorted from smallest to largest
    var bucketized = [];
    var i, j, lowBucket, difference, bucketSpan, ratio;

    for (i=0; i<numberList.length; i++) {
        bucketized[i]=new Array(buckets.length + 1);
        bucketized[i][0]=numberList[i];
        lowBucketIndex=null;

        for (j=0; j<buckets.length; j++) {
            if (lowBucketIndex === null && numberList[i] < buckets[j]) {
                lowBucketIndex=j-1;
                if (lowBucketIndex < 0) {
                    // this bucket gets it all
                    bucketized[i][j+1]=1;
                } else {
                    //divide this value between buckets
                    difference = numberList[i] - buckets[lowBucketIndex];
                    bucketSpan = buckets[j] - buckets[lowBucketIndex];
                    ratio=difference/bucketSpan;
                    bucketized[i][lowBucketIndex+1] = 1-ratio;
                    bucketized[i][j+1] = ratio;
                }
            } else {
                bucketized[i][j+1]=0;
            }
        }
        if (lowBucketIndex === null) {
            bucketized[i][buckets.length] = 1;
        }
    }

    return bucketized;
}

var buckets = [2,3,5,10];
var numberList=[1,2,3,4,5,6,7,8,9,10];
var bucketized = bucketize(numberList, buckets);
var i;

for (i=0; i<bucketized.length; i++) {
    console.log(bucketized[i].join(','));
}

这是一个小提琴

于 2014-09-16T20:40:40.277 回答