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гб памяти. Как оптимизировать эту функцию, что бы расходовалось минимум памяти, а комбинации были длиннее. Сразу скажу, я не в массив собираю. Мне нужно из генератора получить очередную комбинацию, и проверить ее по своим условиям. А значит предыдущие комбинации хранить не нужно.
  • Вопрос задан
  • 110 просмотров
Решения вопроса 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 ...

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

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

Войти через центр авторизации
Похожие вопросы