【问题标题】:Bucketing numbers in an array数组中的分桶数
【发布时间】:2014-09-15 09:18:42
【问题描述】:

我有一个数字列表,例如 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% 进入第 2 年 - 我想没有具体的 此单元格的公式
  • 第 2 年 100% 进入存储桶 2 - 也没有具体公式
  • 第 3 年 100% 进入 Bucket 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)
    • ...等等...

我希望这会让它更清楚。

【问题讨论】:

  • 您能解释一下输入/输出之间的关系吗?为什么 [3,4] 和 [5,4] 都是0.5
  • 是的,当然 - (4-3)/(5-3),这是 [5,4] 的,它的邻居只是 1-that。
  • 你的意思是 (5+4)=(10-3*(1/3)) ?
  • 那又是如何抽象到 [0,0], [3,9], [10,9] 的位置的呢?需要对“x”数字和“y”数字采取哪些步骤才能在 [x,y] 坐标处找到结果?您需要清楚地解释您要解决的问题,因为事实上,我们(或至少 )不知道如何帮助您。
  • @kkudi:你最想要什么? 1)让人们放松他们的时间 2)提出一个谜或 3)得到答案?如果是 1) 或 2),则什么也不做。如果你想要一个答案,拿一个键盘把问题说清楚。

标签: javascript arrays weighting


【解决方案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(','));
}

这是fiddle

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2018-11-19
    • 2020-04-11
    相关资源
    最近更新 更多