Upstream simple-statistics/simple-statistics state of the touched files before e26d2c41ca
This commit is contained in:
commit
1aa682fd34
2 files changed
+61
No files matched your search
@@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* Implementation of [Combinations](https://en.wikipedia.org/wiki/Combination) with replacement
|
||||||
|
* Combinations are unique subsets of a collection - in this case, k x from a collection at a time.
|
||||||
|
* 'With replacement' means that a given element can be chosen multiple times.
|
||||||
|
* Unlike permutation, order doesn't matter for combinations.
|
||||||
|
*
|
||||||
|
* @param {Array} x any type of data
|
||||||
|
* @param {int} k the number of objects in each group (without replacement)
|
||||||
|
* @returns {Array<Array>} array of permutations
|
||||||
|
* @example
|
||||||
|
* combinationsReplacement([1, 2], 2); // => [[1, 1], [1, 2], [2, 2]]
|
||||||
|
*/
|
||||||
|
function combinationsReplacement(x, k) {
|
||||||
|
const combinationList = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < x.length; i++) {
|
||||||
|
if (k === 1) {
|
||||||
|
// If we're requested to find only one element, we don't need
|
||||||
|
// to recurse: just push `x[i]` onto the list of combinations.
|
||||||
|
combinationList.push([x[i]]);
|
||||||
|
} else {
|
||||||
|
// Otherwise, recursively find combinations, given `k - 1`. Note that
|
||||||
|
// we request `k - 1`, so if you were looking for k=3 combinations, we're
|
||||||
|
// requesting k=2. This -1 gets reversed in the for loop right after this
|
||||||
|
// code, since we concatenate `x[i]` onto the selected combinations,
|
||||||
|
// bringing `k` back up to your requested level.
|
||||||
|
// This recursion may go many levels deep, since it only stops once
|
||||||
|
// k=1.
|
||||||
|
const subsetCombinations = combinationsReplacement(
|
||||||
|
x.slice(i, x.length),
|
||||||
|
k - 1
|
||||||
|
);
|
||||||
|
|
||||||
|
for (let j = 0; j < subsetCombinations.length; j++) {
|
||||||
|
combinationList.push([x[i]].concat(subsetCombinations[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return combinationList;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default combinationsReplacement;
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import assert from "node:assert/strict";
|
||||||
|
import { describe, it } from "node:test";
|
||||||
|
import * as ss from "../index.js";
|
||||||
|
|
||||||
|
describe("combinations", function () {
|
||||||
|
it("generates 1 permutation", function () {
|
||||||
|
assert.deepEqual(ss.combinationsReplacement(Object.freeze([1]), 1), [
|
||||||
|
[1]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it("generates combinations of 1,2 choosing two at a time, with replacement", function () {
|
||||||
|
assert.deepEqual(ss.combinationsReplacement(Object.freeze([1, 2]), 2), [
|
||||||
|
[1, 1],
|
||||||
|
[1, 2],
|
||||||
|
[2, 2]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in new issue
Block a user