Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Биномиальные коэффициенты (https://javascript.ru/forum/offtopic/47740-binomialnye-koehfficienty.html)

Tim 05.06.2014 14:04

Биномиальные коэффициенты
 
В комбинаторике биномиальный коэффициент означает, число всех возможных вариантов выборки k элементов из множества элементов n.



Пример:

Из множества n {1,2,3,4}, выбираем все возможные комбинации из двух элементов, k=2

{1,2} {1,3} {1,4} {2,3} {2,4} {3,4}

Получается шесть возможных вариантов.


----------------------------------------


Как написать алгоритм перебирающий все эти варианты?

l-liava-l 05.06.2014 14:25

Цитата:

Получается шесть возможных вариантов.
Как написать алгоритм перебирающий все эти варианты?
Ну по идее сочетание определяет совокупности элементов не на всем множестве когда порядок не важен, и дает ток кол-во возможных исходов..

Если хочешь их посмотреть то нужно строить таблицу элементарных исходов
В цикле наверное пробегаться

Берешь первый элемент, и подставляешь к нему оставшиеся по очереди(в данном случае 2 оставшихся)
Потом делаешь то же самое с другими.

Если юзаешь не сочетание а размещение (где порядок важен)
То там получается все остальные добавляешь

nerv_ 05.06.2014 14:34

если в лоб, то так
var input = [1, 2, 3, 4];
var output = [];
var len = input.length;

for(var i = 0; i < len; i++) {
    var j = i + 1;
    for(; j < len; j++) {
        output.push([
            input[i],
            input[j]
        ]);
    }
}

console.log(output);
console.log(JSON.stringify(output));

но я не проверял :no:

Tim 05.06.2014 14:36

nerv_,
будет с повтрениями 1,2 2,1 и тп. в моём случае порядок не важен

Tim 05.06.2014 14:37

я так подумал, что мне проще один раз этот массив вычислить (пусть не самым рациональным способом) и запихать куда нибудь в базу

l-liava-l 05.06.2014 14:37

nerv_,
Да)

Цитата:

будет с повтрениями 1,2 2,1 и тп. в моём случае порядок не важен
Как раз без повторений порядок же не важен)
Есть 2 цифры и пофиг в каком они положении

Tim 05.06.2014 14:58

l-liava-l,
Цитата:

Пусть имеется n различных объектов.
Будем выбирать из них m объектов все возможными способами (то есть меняется состав выбранных объектов, но порядок не важен). Получившиеся комбинации называются сочетаниями из n объектов по m, а их число равно


http://www.matburo.ru/tv_komb.php


p.s.: вы достали, я думал поможете, а вы тока моск насилуете :D :)

cyber_ua 05.06.2014 15:14

Tim, я не совсем пойму причем тут эта формула,

Она поможет найти общее кол-во возможных комбинаций, а не их самих.

рони 05.06.2014 15:19

Tim,
k всегда 2?

Tim 05.06.2014 15:25

Цитата:

Сообщение от cyber_ua
Она поможет найти общее кол-во возможных комбинаций, а не их самих.

Верно, в этом и проблема


Цитата:

Сообщение от рони
k всегда 2?

не, у меня покер. 52 карты в колоде и 5 нужно выбрать. те к = 5

http://pokercardplay.net/articles/13...naciy_v_pokere

рони 05.06.2014 15:35

Tim,
так будет 5 for
function get() {
    var c = [];
    for (var k1 = 0; k1 < 48; k1++) {
        for (var k2 = k1 + 1; k2 < 49; k2++) {
            for (var k3 = k2 + 1; k3 < 50; k3++) {
                for (var k4 = k3 + 1; k4 < 51; k4++) {
                    for (var k5 = k4 + 1; k5 < 52; k5++) {
                        c.push([k1, k2, k3, k4, k5])
                    }
                }
            }
        }

    }
    return c
}

Tim 05.06.2014 18:06

рони,
очень похоже на правду

nerv_ 05.06.2014 19:25

Цитата:

Сообщение от рони
так будет 5 for

чуть подправлю:
var input = [1, 2, 3, 4, 5];
var output = [];
var len = input.length;
// var k = 3;

for(var i = 0; i < len - 2; i++) {
    for(var j = i + 1; j < len - 1; j++) {
        for(var q = j + 1; q < len; q++) {
            output.push([
                input[i],
                input[j],
                input[q]
            ]);
        }
    }
}

console.log(JSON.stringify(output));


формула:
var count = c(5) / (c(5 - 3) * c(3));

console.log(count);

function c(n) {
    for(var i = 1, len = n + 1, r = i; i < len; i++) {
        r *= i;
    }
    return r;
}
Тем не менее, не очень правильно задавать k кол-вом циклов :)

melky 05.06.2014 19:50

кто сможет решить однострочником-генератором из ES6 ? интересно взглянуть и поизучать

Tim 06.06.2014 10:54

Цитата:

Сообщение от nerv_
Тем не менее, не очень правильно задавать k кол-вом циклов

нормально (когда оно не слишком большое и не меняется)

l-liava-l 06.06.2014 11:41

Цитата:

нормально (когда оно не слишком большое и не меняется)
лучшеб в рекурсию его кинуть)

nerv_ 06.06.2014 14:16

Цитата:

Сообщение от l-liava-l
рекурсию

угу. Я тоже об этом подумал вчера :yes:

Сделаешь?)

l-liava-l 06.06.2014 15:10

Цитата:

угу. Я тоже об этом подумал вчера

Сделаешь?)
Нужно думать, не)


Часовой пояс GMT +3, время: 22:30.