корректировка массива чисел - PullRequest
1 голос
/ 18 августа 2011

с учетом массива чисел, как можно корректировать одно число и амортизировать разницу пропорционально по определенным другим элементам в массиве?

с учетом:

var array = [10,20,30,40,50]

-> настроить третий элемент на 30 и вычесть пропорционально через первый ипоследний такой, что сумма элементов по-прежнему составляет 150 (второй и четвертый элементы в массиве являются фиксированными или должны остаться неизменными).

= должно получиться: [5,20,60,40,25]

(в идеале javascript, но я мог бы перевести с C # / VB.net, если это желательно)

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Полагаю, мог бы помочь следующий фрагмент:

function amortize(array, updatedValueIndex, delta, amortizeIndexes){
    var sum = 0;
    for(var i = 0; i < amortizeIndexes.length; i++){
        sum += array[amortizeIndexes[i]];
    }

    for(var i = 0; i < amortizeIndexes.length; i++){
        array[amortizeIndexes[i]] -= delta * array[amortizeIndexes[i]] / sum;
        if (array[amortizeIndexes[i]] < 0) array[amortizeIndexes[i]] = 0;
    }

    array[updatedValueIndex] += (delta > sum) ? sum : delta;        

    return array;
}

amortize([10,20,30,40,50], 2, 30, [0, 4]);
1 голос
/ 18 августа 2011

Вот JS-функция общего назначения, чтобы равномерно распределить корректировку по всем остальным элементам в массиве:

var array = [10,20,30,40,50];

function amortize(list, index, amount) {
    if (list.length <= 1) return;    // can't amortize with 0 or 1 items in list
    var remaining = amount / (list.length - 1);
    list[index] += amount;
    for (var i = 0; i < list.length; i++) {
        if (i != index) {
            list[i] -= remaining;
        }
    }
}

Если вы действительно хотите, чтобы универсальная функция просто настраивала концы и оставляла те по обе стороны от середины нетронутыми, то вы бы просто сделали это:

var array = [10,20,30,40,50];

function amortizeEnds(list, amount) {
    var remaining = amount / 2;
    list[0] -= remaining;
    list[4] -= remaining;
    list[2] += amount;
}

Я не уверен, что понимаю ваш пропорциональный запрос, но вот тот, который дает вам запрошенный результат:

var array = [10,20,30,40,50];

function amortizeEndsProportional(list, amount) {
    var endsTotal = list[0] + list[4];
    var reductionProportion = amount / endsTotal;
    list[0] = list[0] - list[0] * reductionProportion;
    list[4] -= list[4] - list[4] * reductionProportion;
    list[2] += amount;
}

Вы можете увидеть последнюю работу здесь: http://jsfiddle.net/jfriend00/QayQp/.

...