Как представить число с заданными числами, используя арифметические операции? - PullRequest
3 голосов
/ 09 ноября 2010

Это вопрос для интервью . «Учитывая массив чисел и другое число, выясните, можно ли манипулировать массивом чисел, используя стандартные математические методы, чтобы равняться другому заданному числу. Например, учитывая 5 и 10, вы можете сделать 50? 5 * 10 = 50, так что да ». (Для простоты предположим только арифметические операции).

Я бы предложил использовать поиск методом грубой силы (с некоторой ветвью и границей). Имеет ли это смысл?

Ответы [ 6 ]

4 голосов
/ 09 ноября 2010

Грубая сила звучит как правильный способ приблизиться к этому.Но грубая сила - это неосведомленный поиск ... он не дает обоснованных предположений, по какому пути идти, когда вы достигнете ветви в дереве поиска.

То, что вы, возможно, захотите посмотреть, - есть ли эвристические функции , которые могут помочь вам сделать поиск информированных .Эвристическая функция смотрит на состояние и дает оценку того, как далеко вы находитесь от цели.Если вы можете найти действительную эвристическую функцию, вы можете применить алгоритм, подобный A *.

. Имейте в виду: кажется, что это не простая задача для определения эвристики.

1 голос
/ 10 ноября 2010

Программирование на Хаскеле, Глава 11: Проблема с обратным отсчетом

1 голос
/ 09 ноября 2010

Я бы спросил

  • Являются ли Numbers целыми числами?
  • Существует ли верхний предел шкалы чисел?
  • Какой standard mathematical techniquesпредназначены?
    • только простая арифметика?
    • корни, полномочия?
    • взаимные?
    • функции триггера?

и т.д.

0 голосов
/ 10 ноября 2010

Очень важный первый вопрос: разрешены ли унарные операции? То есть я могу изменить x на -x, 1 / x, x !, или sqrt (x) "бесплатно"?

Если это так, наивный разветвленный поиск не прекратится, так как нет априорного ограничения на количество использований унарных операций. Если нет, наивный поиск может работать просто отлично.

Вот забавная стратегия, если не эффективная: попросите или создайте грамматику БНФ для используемой арифметики. Взломать в правиле, как

<единица> :: = 5 | 10

, а затем используйте эту грамматику для разработки всех возможных выражений, полученных, скажем, с использованием менее 20 грамматических правил. Оцените их все. Это будет гарантированно ограничено и будет генерировать все «не слишком сложные» выражения, допустимые в языке.

0 голосов
/ 10 ноября 2010

Еще один способ решить эту проблему - использовать генетические алгоритмы .Ваша популяция будет начинаться как случайные операторы, вставленные между элементами вашего массива.

Пусть S будет число, которое вам нужно получить.Ваша фитнес-функция может быть |S - Value(E[i])|, где Value(E[i]) - это значение после оценки i -ого выражения в вашем населении.

Ваш оператор мутации может просто поменять один оператор на другой, и ваша функция кроссовераможно комбинировать операторы слева от выражения с операторами справа от другого выражения.

Возможно, вы сможете найти более сложные функции, которые работают лучше, генетические алгоритмы требуют некоторой работы по угадыванию для достижения наилучших результатов.

Я понятия не имею, как это можно сравнить с грубой силой, но это другое решение, и я думаю, что это выделит вас на собеседовании, поскольку каждый сможет увидеть решение с помощью грубой силы.

Если вам нужно только достаточно хорошее решение (что-то не совсем S, но достаточно близко), то это определенно должно быть быстрее, чем грубая сила.В нескольких реализованных мною генетических алгоритмах я заметил, что они быстро приближаются к решению, близкому к оптимальному, но довольно медленны, а иногда даже застревают, если вам нужно оптимальное решение.

0 голосов
/ 09 ноября 2010

Я думаю, что это имеет смысл.

Вы можете воспользоваться симметрией между умножением, чтобы дополнительно обрезать свое дерево. a * b = b * a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...