生成单词中所有可能的二进制组合('true''false')性能

Generating all possible binary combinations in words ('true' 'false') performance

本文关键字:true false 性能 组合 单词中 有可能 二进制      更新时间:2023-09-26

我正在关注以下脚本的性能改进。我非常确信它可以进行实质性的修改,我这样做是因为它是我脑海中浮现的第一件事,它只是为了展示我想要的东西。

function pad(nn, width, z) {
    z = z || '0';
    nn = nn + '';
    return nn.length >= width ? nn : new Array(width - nn.length + 1).join(z) + nn;
}
var makeIntoBinary = function(ii, length) {
    return pad(ii.toString(2), length);
}
var makeIntoTrueFalse = function(binary) {
    var str = '';
    for (iii = 0; iii < binary.length; iii++) {
        if (binary[iii] == '0') {
            str += ' false';
        } else {
            str += ' true';
        }
    };
    console.log(str + ' ' + binary);
}
var runner = function(n) {
    var iter = Math.pow(2, n);
    for (i = 0; i < iter; i++) {
        makeIntoTrueFalse(makeIntoBinary(i, n));
    }
}

我正在寻找的是为所有可能的组合生成单词集,这本质上是在做上面的二进制运算。(runner(2);将产生false falsefalse truetrue falsetrue true)我正在寻找一种能让我走到这一步的闪电般快速的算法。

尝试直接操作位,而不进行无关的字符串转换。

function combinations(n) {
  var r = [];
  for(var i = 0; i < (1 << n); i++) {
    var c = [];
    for(var j = 0; j < n; j++) {
      c.push(i & (1 << j) ? 'true' : 'false');  
    }
    r.push(c.join(' '));
  }
  return r;  
}
r = combinations(prompt('size?'));
document.write(JSON.stringify(r));

只是为了记录,这可能较慢,但要好得多:

Number.prototype.times = function(fn) {
  var r = [];
  for(var i = 0; i < this; i++)
    r.push(fn(i));
  return r;
}
function combinations(n) {
  return (1 << n).times(function(i) {
    return n.times(function(j) {
      return Boolean(i & 1 << j);
    });
  });
}