Упрощение сложности 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.

вот построчная идея каждого времени выполнения

  1. это простое разбиение, и я собираюсь просто дать ему константу c1.
  2. max_k-небольшое число, всегда меньше n, возможно, около 4 или 5. Я буду использовать k ниже.
  3. этот цикл всегда работает 2^k*(N выберите k) раз
  4. рассматривая константу линии 1, мы можем обобщить эту линию и знать, что она никогда не будет срабатывать более 2^n раз в худшем случае, но обычно будет работать в 2^n раз, поэтому мы назовем это (2^n) / c2
  5. это простая операция 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, но это, конечно, не так при работе с продуктом.