Рубрики
Без рубрики

Оптимизация кода с алгеброй

Немного понимания того, как математика делает нас лучшими разработчиками. Теги с кодировкой, математикой, оптимизацией, Python.

Фото Романа Mager на Unsplash

Во время семестра в колледже я взял предмет под названием «Дискретная математика». Лектор решил разделить класс в группах. Каждая группа состояла из 2 или 3 студентов. Они должны были сделать экспозиции о конкретном предмете, назначенном лектором.

В группе я был на (мы были только два, на самом деле), мы были назначены с предметом Рецидивирующие отношения . По словам Википедии , это:

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

Другими словами, а Рекурсивная функция 😉

Идеальная ситуация, чтобы объяснить эту концепцию с кодом: D

Ханой Башни

Ты помнишь эту игрушку?

Знаменитые башни Ханой. Игра состоит из перемещения каждого диска из первого полюса до последнего (слева направо или вицеверса), в наименьшее количество шагов. Правила заключаются в том, что больший диск не может быть более меньшим, и вы можете переместить только один диск в то время. Что-то вроде этого:

Эта проблема имеет алгоритм, который решает его, он идет так:

Где n это количество дисков в проблеме.

Давайте код что

Давайте использовать Python, чтобы написать этот алгоритм. Это что-то подобное:

def hanoi(n):
    if n <= 1: return 1
    else: return 2 * hanoi(n-1) + 1

Так что, если у нас есть 4 диска …

>>> hanoi(4)
15

Хороший. Оно работает. Давайте дадим Несколько попыток

>>> hanoi(5)
31
>>> hanoi(10)
1023
>>> hanoi(40)
1099511627775

Выглядит довольно хорошо. Теперь я знаю, сколько движется, что он возьмет у меня, если я использую 40 дисков (кстати, это займет вас 10460 лет, никогда не пробую это дома). Но что, если у меня будет 7000?

>>> hanoi(7000)
Traceback (most recent call last):which
  File "", line 1, in 
  File "", line 3, in hanoi
  File "", line 3, in hanoi
  File "", line 3, in hanoi
  [Previous line repeated 994 more times]
  File "", line 2, in hanoi
RecursionError: maximum recursion depth exceeded in comparison

Ох … кажется, это не достаточно исполняется. Конечно, вы можете «решить» это просто увеличение максимальной глубины рекурсии в Python (с Sys.setrocursionlimit (n) ), но это гораздо лучшая идея оптимизировать это.

Оптимизация

Есть несколько способов решить рецидивные отношения, один из них – Итерация Отказ Он состоит из решавления операции шага за шагом и вычитая нерешительное уравнение из процесса. Сначала мы стараемся решить данную ценность:

Затем, от последней строки, мы можем вывести эквивалентное уравнение:

Если вы заметите, T (4) + 7 такой же, как t (4) ^ (4-1) + (2^(4-1) - 1) Вот почему это наше первоначальное утверждение. Но теперь мы решили отношение рецидива, давайте использовать это в нашем коде.

def better_hanoi(n):
    return 2**n - 1

А потом…

Теперь мы знаем, сколько шагов возьмут, чтобы решить его с 7000 дисками (вероятно, на всю жизнь вселенной, несколько раз).

Заключение

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

Оригинал: “https://dev.to/socratesdz/optimizing-code-with-algebra-37en”