Упрощение сложности Big-O этого экспоненциального алгоритма
у меня есть алгоритм подсчета, для которого я пытаюсь получить общее описание big-o. Оно ужасно вложено и ужасно экспоненциально. Вот это:
1. For each T_i in T
2. For k = 1 to max_k
3. For each of 2^k*(n choose k) items
4. For each t in T_i
5. check if the item is in t...etc.
вот построчная идея каждого времени выполнения
- это простое разбиение, и я собираюсь просто дать ему константу c1.
- max_k-небольшое число, всегда меньше n, возможно, около 4 или 5. Я буду использовать k ниже.
- этот цикл всегда работает 2^k*(N выберите k) раз
- рассматривая константу линии 1, мы можем обобщить эту линию и знать, что она никогда не будет срабатывать более 2^n раз в худшем случае, но обычно будет работать в 2^n раз, поэтому мы назовем это (2^n) / c2
- это простая операция if-statement внутри всех этих циклов, поэтому c3.
умножение всех этих вместе дает:
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
так как я хочу представление big-O, игнорируя константы дает:
k * 2^k * (n choose k) * (2^n)
известно, что (n выбрать k) ограничено выше (n * e / k)^k, так что:
O(k * 2^k * (n * e / k)^k * (2^n))
мой вопрос в том, что я могу игнорировать здесь... 2^n, безусловно, является доминирующим термином, так как n всегда больше, чем k, и обычно намного больше. Можно ли это упростить до O (2^n)? Или O(2^страшная)? Или я должен оставить в 2^k, как в O (2^k * 2^n)? (или оставить все условия?)
Я понимаю, что если k или max_k могут конкурировать или превосходить n, то они жизненно важны. Но поскольку они всегда доминируют, могут ли они быть отброшены, как члены нижнего порядка полиномиального времени работы? Я полагаю, что весь экспоненциальный беспорядок времени работы сбивает меня с толку. Любые советы очень ценятся.
1 ответов
я понимаю, что если k или max_k могут конкурировать или превосходить n, то они жизненно важны!--22-->
верно, но наоборот, это не означает, что его нельзя игнорировать, когда дело доходит до большой записи O, даже если она не конкурирует с n. его можно игнорировать, только если max_k ограничен константой (существует постоянная c
такое, что k <= c
). Например -O(n * logk)
алгоритмы, не O(n)
, так как коэффициент k не ограничен и таким образом, существует k
такое, что nlogk > c*n
для каждой константы c
.
поскольку выражение, которое вы получили, является продуктом, все, что вы можете игнорировать, это константы, которые в вашем случае - это только e
получаете вы O(k*2^k * (n/k)^k * 2^n)
.
если k
is ограниченном, то вы можете удалить его из выражения, а также в большой o нотации, и вы получите O(n^k* 2^n)
. Обратите внимание, что даже в этом случае, хотя n^k << 2^n
, его все еще нельзя игнорировать, потому что для каждой константы c есть некоторые n
такое, что c*2^n < n^k *2^n
, поэтому алгоритм не является O(2^n)
один.
меньшие факторы можно игнорировать, когда дело доходит до сложения. Если k < n
затем O(n + k) = O(n)
, потому что есть константы c,N
такие, что для всех n > N
: c*n < n + k
, но это, конечно, не так при работе с продуктом.