Задать вопрос
@negr_vitalya
Я скелет - негр виталя

Как сделать эффективный алгоритм перебора всех возможных значений?

Допустим у нас есть набор символов: a, b, c. А также есть диапазон от a до cc(
этот самый диапазон
a, b, c, aa, ba, ca, ab, bb, cb, ac, bc, cc
). То есть в диапазон должно входить 3^2=9 значений, которые нужно сгенерировать и перебрать. У меня было идея создать целочисленную переменную, к которой с каждым циклом прибавлять 1, и уже после этого делить на 3, 9 и т.д., но при работе с большьшой длиной это будет занимать большое количество памяти и + с каждым увеличением длины нужно будет совершать ещё большее число математических операций, тем самым создавая большую нагрузку на процессор.
  • Вопрос задан
  • 154 просмотра
Подписаться 1 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
Если у вас все значения - то цикл в цикле. Что там еще оптимизировать. Хотя 9 значений можно и константами вбить. Не сильно понятно что вы хотите оптимизировать и зачем
Ответ написан
trapwalker
@trapwalker
Программист, энтузиаст
Опишите функцию получения следующего значения после предыдущего (функция инкремента строки).
Для этого нужно просто заменить последний разряд на следующее его значение, а если строка пустая, то вернуть "а".
Если произошло переполнение, то выполняем функцию инкремента к строке без последнего символа, и результат конкатенируем с "а".

Такому алгоритму не нужно памяти сверх необходимого для хранения одной последовательности, плюс небольшая константа для переменных. В общем, инкрементация в среднем за O(log_M(N)), где M - размер алфавита, а N - число знаков.

У вас, кстати, еще ошибка:
То есть в диапазон должно входить 3^2=9 значений,

3^2+3^1
Ответ написан
@negr_vitalya Автор вопроса
Я скелет - негр виталя
Я запилил решение сам. Дальше продолжайте пейсать свои вложенные циклы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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