Задать вопрос
paulenot
@paulenot
IT Issue

Как оптимизировать генератор слов на PHP?

Нашел на сайте такую функцию:
function gen($chars, $length, &$words, $prefix = '') {
		if (strlen($prefix) == $length) {
			$words[] = $prefix;
			return;
		}
		for ($i = 0; $i < strlen($chars); $i++) {
			gen($chars, $length, $words, $prefix.$chars{$i});
		}
		return;
	}


	$chars = '_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789';
	gen($chars,5,$words,);
	foreach ($words as $word) {
		// My Code ...
	}

При вызове функции и передаче длины более 5 выскакивает ошибка о том, что скрипту не хватает 5гб памяти. Как оптимизировать эту функцию, что бы расходовалось минимум памяти, а комбинации были длиннее. Сразу скажу, я не в массив собираю. Мне нужно из генератора получить очередную комбинацию, и проверить ее по своим условиям. А значит предыдущие комбинации хранить не нужно.
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой 7 комментариев
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function genWords($alphabet, $length) {
    $alph = mb_str_split($alphabet);
    $maxChar = count($alph);
    $idxs = array_fill(0, $length, 0);
    while (true) {
        yield implode('', array_map(fn($idx) => $alph[$idx], $idxs));
        $pos = $length - 1;
        while (true) {
            $idxs[$pos] += 1;
            if ($idxs[$pos] < $maxChar) {
                break;
            }
            $idxs[$pos] = 0;
            $pos -= 1;
            if ($pos < 0) {
                return;
            }
        }
    }
}

foreach (genWords('АБВГДЕЁЖЗ', 5) as $word) {
    print "{$word}\n";
}
Ответ написан
Комментировать
@rPman
Этот алгоритм пытается сохранить все сгенерированные слова в памяти, это 64^5 строк на это никакой оперативки не хватит

Вместо
$words[] = $prefix;
вставь свой код, который сейчас в цикле
// My Code ...

либо оформи его вызов через анонимную функцию, так синтаксически будет красивее
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы