Недавно я работал с комбинациями слов, чтобы сделать «фразы» на разных языках, и я заметил несколько вещей, которые я мог бы сделать с некоторыми дополнительными экспертными знаниями.Комбинации (n выберите k) параллелизация и эффективность
Определение некоторых констант для этого,
Глубины (n
) составляет в среднем 6-7
Длина входного набора составляет ~ 160 уникальных слов.
- Память. Генерация n перестановок на 160 слов тратит много места. Я могу злоупотреблять базами данных, записывая их на диск, но потом я получаю удар в производительности, так как мне нужно постоянно ждать ввода-вывода. Другой трюк состоит в том, чтобы сгенерировать комбинации на лету, как объект генератора.
- Время - если я не ошибаюсь
n choose k
получает большой быстро что-то вроде этой формулыfactorial(n)/(factorial(depth) * (factorial(n-depth)))
это означает, что наборы ввода быстро становятся огромными.
Мой вопрос, таким образом.
Учитывая, что у меня есть функция f(x)
, которая берет комбинацию и применяет расчет, который имеет стоимость, например.
func f(x) {
if query_mysql("text search query").value > 15 {
return true
}
return false
}
Как я могу эффективно обрабатывать и выполнять эту функцию на огромном наборе комбинаций?
Бонусные вопросы, могут быть сгенерированы комбинации одновременно?
Обновление: Я уже знаю, как их генерировать условно, тем более его эффективность.
«глубина» остается постоянной при вычислении. Таким образом, для одного запуска алгоритма ваш вывод представляет собой комбинацию слов 'depth = 6' из слова длиной 160 или всех комбинаций слов в диапазоне' [1,6] '? –
@MattiLyra В идеале я хочу, чтобы глубина была от [n..2], но позвольте мне сосредоточиться на одном на данный момент и удалили строку для ясности. –
Хорошо, что дало бы вам один способ распараллеливания комбинаций, запустить каждый из «n = 3, n = 4 ... n = n' параллельно, поскольку они не зависят друг от друга. –