function estimate(N, n) {
const info = stats(N, n);
const blockSize = 2 ** info.loBits;
const numBlocks = Math.ceil(N / blockSize);
const values = generateValues(N, n);
const lengthPerBlock = d3.rollup(
values,
(g) => g.length,
(d) => d >>> info.loBits
);
const linear =
d3.sum(lengthPerBlock.values(), (k) => (k + 1) / 2) / numBlocks;
const log =
d3.sum(lengthPerBlock.values(), (k) => Math.log2(k) + 1 / (k + 1)) /
numBlocks;
return {
values,
linear,
log,
lengthPerBlock,
info,
numBlocks,
blockSize,
info
};
}