非常长的排列 - 句子anagram

时间:2015-08-14 11:39:32

标签: javascript node.js algorithm permutation permute

我有一个近2700个字符串的数组,我需要找到一个句子anagram的正确短语。该列表是一个排序列表,几乎有100k项长的单词列表。

我希望将它们合并为1,2和2。如果它们符合我的字谜长度,则会将3个单词组合在一起并匹配单词的长度,并修剪为空格。

我试过这个功能,但它在内存上失败了,我可以将最多3个单词放在一起以匹配:

var permutations = require('./permutations.js').permutations;

var shortList = words.slice(10, 20);

var result = permutations(shortList);
console.log(result);

和permutation.js中的这个

(function (exports) {
  'use strict';
  var permutations = (function () {
    var res;
    function swap(arr, i, j) {
      var temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
    function permutations(arr, current) {
      if (current >= arr.length) {
        return res.push(arr.slice());
      }
      for (var i = current; i < arr.length; i += 1) {
        swap(arr, i, current);
        permutations(arr, current + 1);
        swap(arr, i, current);
      }
    }
    return function (arr) {
      res = [];
      permutations(arr, 0);
      var temp = res;
      // Free the extra memory
      res = null;
      return temp;
    };
  }());
  exports.permutations = permutations;
}((typeof window === 'undefined') ? module.exports : window));

编辑:

实施例

var input = ['test', 'foo', 'bar', 'hello', 'world'];

var output = magicFunc(input);
// console.log(output);
//
// [['test foo bar'],
//  ['test foo hello'],
//  ['test foo world'],
//  ['test bar foo'],
//  ['test bar hello'],
//  ['test bar world']...];

2 个答案:

答案 0 :(得分:1)

3个单词的所有排列都是3个! = 6

100,000字的选择3的所有组合是100000! / 6(99,996!)〜= 1.66e14

所以你的最终输出是1.66e14 * 6~ = 9.99e14

尝试创建1千万亿字符串数组的列表比计算机可以处理的更多。

  
    

我试过这个功能,但内存失败

  

轻描淡写

您必须在单词列表上进行一些预处理。按照它们包含的字母和长度对它们进行分区。然后对你的字谜进行更集中的搜索。

最后,不要为此使用递归(它没有必要,因为为每次调用创建了堆栈帧,所以它会更快用完。

  
    

只需使用for循环三次我循环你就可以得到每一个结果 - Daniel Cheung

  
for(var i = 0; i < list.length; i++) {
  var wi = list[i];
  for(var j = i + 1; j < list.length; j++) {
    var wj = list[j];
    for(var k = j + 1; k < list.length; k++) {
      var wk = list[k];
      // hard coded 6 permutations
      var p1 = wi + wj + wk;
      var p2 = wi + wk + wj;
      var p3 = wj + wi + wk;
      var p4 = wj + wk + wi;
      var p5 = wk + wi + wj;
      var p6 = wk + wj + wi;
      // check p1 - p6 for your anagram condition
      ...
    }
  }
}

答案 1 :(得分:0)

排列不重复,长度为3:

&#13;
&#13;
var input = ['test', 'foo', 'bar', 'hello', 'world'],
    output = input.reduce(function (r, a, i) {
        input.forEach(function (b, j) {
            i !== j && input.forEach(function (c, k) {
                i !== k && j !== k && r.push([a, b, c]);
            });
        });
        return r;
    }, []);
document.write('<pre>' + JSON.stringify(output, null, 4) + '</pre>');
&#13;
&#13;
&#13;