Как видно из названия, что является примером итеративного алгоритма O (2 ^ n)? Когда это обычно происходит?

1
user2793618 22 Фев 2020 в 19:42

2 ответа

Лучший ответ

Башня Ханоя может быть хорошим примером.

Ханойская башня состоит из трех стержней или колышков с n дисками, расположенными один над другим.

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

1. Одновременно можно перемещать только один диск. 2. Каждый ход состоит в том, чтобы взять верхний диск из одной стопки и поместить его поверх другой стопки или на пустой стержень. 3.На диске меньшего размера нельзя размещать диск большего размера.

Минимальное количество ходов, необходимое для решения головоломки Ханойской башни, составляет 2 ^ n - 1, где n - количество дисков.

https://en.wikipedia.org/wiki/Tower_of_Hanoi#Iterative_solution

2
Ranjita Shetty 23 Фев 2020 в 07:27

Эта ссылка объясняет это лучше, но алгоритм с порядком O ( 2 ^ n) обычно жадный алгоритм. Самый жадный из всех, кого я знаю, это O (n ^ n). Алгоритм восстановления Фибоначчи, без использования метода запоминания значений, является примером алгоритма O (2 ^ n).

Пример ( Python )

def fib(n):
    if n == 0: return 1
    if n == 1: return 1
    return fib(n-1) + fib(n-2)

В строке 4 мы имеем, что функция вызывается дважды. Это означает, что итерационный метод будет вызываться 2 раза за каждый вызов.


Для чего-то строго итеративного вы можете рассмотреть пример (код на python):

def O2n(n):
    a = 0
    while True:
        if a < 2**n:
            a = a + 1
        else:
            break
    return a

В коде я заставляю алгоритм быть O (2 ^ n) через условие. Это не практический пример, но с помощью условия можно получить алгоритмы другого порядка.

1
Matheus Silva 22 Фев 2020 в 20:05