2015-08-14 4 views
1

У меня есть массив из почти 2700 строк, мне нужно найти правильную фразу для предложения anagram. Список представляет собой отсортированный список, содержащий почти 100 тыс. Элементов списка слов, которые будут соответствовать.Очень длинные перестановки - предложение anagram

И я хочу объединить их в 1, 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)); 

EDIT:

Пример

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']...]; 
+1

Я не понимаю. У вас есть два списка строк, один из которых содержит 2700 элементов (слова?), А другой - 100 000 элементов. Что ты хочешь делать? –

+0

Вы должны создать пример вывода для данного входа. – BlackBrain

+0

Извините за неправильное объяснение, у меня есть массив из 2700 строк, которые мне нужно перестановить в предложения из 3 слов и получить результаты. –

ответ

1

Все перестановки 3 слова - 3! = 6

Все комбинации из 100 000 слов выбрать 3 100000!/6 (99996!) ~ = 1.66e14

Так что ваш конечный результат будет 1.66e14 * 6 ~ = 9.99e14

Попытки создать список 1 квадриллион строковых массивов больше чем ваш компьютер может обрабатывать.

Я попробовал эту функцию, но она не на память

преуменьшение


Вы собираетесь должны сделать некоторые предварительной обработки в списке слов. Разделите их на какие буквы они содержат и их длину. Затем сделайте более целенаправленный поиск ваших анаграмм.

Наконец, не следует использовать рекурсию для этого (это не обязательно, и он будет использовать meory быстрее из стека кадров создается для каждого вызова.

просто использовать цикл три раза IJK перекручивание вам, что вы можете получить все результаты - 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 
     ... 
    } 
    } 
} 
0

перестановки без повторений с длиной три:

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>');

Смежные вопросы