Почему задачи о ранце псевдо-полиномиальное?

Я знаю, что Knapsack является NP-полным, пока он может быть решен DP. Говорят, что решение DP pseudo-polynomial, поскольку она является показательной в "Длина входа" (т. е. число бит, необходимое для кодирования входных данных). К сожалению, я его не получил. Может ли кто-нибудь объяснить это pseudo-polynomial что до меня медленно ?

4 ответов


время работы O (NW) для неограниченной задачи рюкзака с N элементами и рюкзаком размера W. W не является полиномом по длине ввода, что и делает его псевдо-полином.

Рассмотрим W = 1,000,000,000,000. Для представления этого числа требуется только 40 бит, поэтому входной размер = 40, но вычислительная среда выполнения использует коэффициент 1,000,000,000,000, который равен O (240).

таким образом, среда выполнения более точно называется O (N. 2биты в W), который является экспоненциальной.

Смотрите также:


в большинстве наших проблем мы имеем дело с большими списками чисел, которые удобно вписываются в стандартные типы данных int/float. Из - за того, что большинство процессоров построены для обработки 4-8 байтовых чисел за раз без каких-либо дополнительных затрат (относительно чисел, которые вписываются, скажем, в 1 байт), мы редко сталкиваемся с изменением времени выполнения от масштабирования наших чисел вверх или вниз в диапазонах, с которыми мы сталкиваемся в реальных проблемах, поэтому доминирующим фактором остается просто количество точек данных, n или m факторы, к которым мы привыкли.

(вы можете себе представить, что нотация Big-O скрывает постоянный фактор, который делит 32 или 64 бита на датум, оставляя только количество точек данных, когда каждое из наших чисел вписывается в это количество бит или меньше)

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

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


время выполнения алгоритма рюкзака связано не только с размером входного сигнала (n - количество элементов), но и с величиной входного сигнала(W - емкость рюкзака) O (nW), которая экспоненциальна в том, как она представлена в компьютере в двоичном формате (2^n) .Вычислительная сложность (i.e как обработка выполняется внутри компьютера через биты) касается только размер вклада, не их величины/значения.

игнорировать список значений / весов на мгновение. Предположим, у нас есть экземпляр с емкостью рюкзака 2. W возьмет два бита во входных данных. Теперь мы увеличим емкость рюкзака до 4, сохранив остальную часть ввода. Наши входные данные выросли только на один бит, но вычислительная сложность увеличилась в два раза. Если мы увеличим емкость до 1024, у нас будет только 10 бит ввода для W вместо 2, но сложность увеличилась в 512 раз. Сложность растет экспоненциально в размер W в двоичном (или десятичное) представление.

еще один простой пример, который помог мне понять псевдо-полиномиальное концепция наивную простоту тестирования алгоритма. Для данного числа n мы проверяем, делится ли оно равномерно на каждое целое число в диапазоне 2..√n, поэтому алгоритм выполняет √(n-1) шаги. Но здесь N-величина входного сигнала, а не его размер.

                     Now The regular O(n) case

напротив, поиск массива для данного элемента выполняется в полиномиальное время: O (n). Он принимает не более n шагов, и здесь n-размер входного сигнала (длина массива).

[ см. здесь ]

вычисление битов, необходимых для хранения десятичного числа


Как я понимаю, это то, что емкость была бы O (W), если бы входная емкость были массив [1,2,..., W], который имеет размер W. Но вход емкости не является массивом чисел, это вместо одного целого числа. Сложность времени-это отношения до в размере вход. The в размере целого числа - это не значение целого числа, а количество битов, представляющих его. Позже мы преобразуем это целое число W в массив [1,2,..., W] в алгоритме, заставляющем людей ошибочно думать, что W-это размер,но этот массив не является входным, само целое число.

подумайте о вводе как "массив материала", а размер как"сколько материала в массиве". Вход элемента фактически представляет собой массив из n элементов в массиве so size=n. вход емкости не является массивом чисел W в нем но одно целое число, представленный массивом битов log(W). Увеличить размер из него на 1 (добавление 1 значимого бита), W удваивается, поэтому время выполнения удваивается, следовательно, экспоненциальная сложность времени.