Что такое “P=NP?”, и почему это - такой известный вопрос? [закрытый]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

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

225
задан tanascius 18 February 2010 в 01:45
поделиться

6 ответов

P стоит в течение полиномиального времени. NP стоит в течение недетерминированного полиномиального времени.

Определения:

  • Полиномиальное время средства, что сложность алгоритма является O (n^k), где n является размером Ваших данных (например, число элементов в списке, который будет отсортирован), и k является константой.

  • Сложность является временем, измеренным в количестве операций, которые это взяло бы как функция количества элементов данных.

  • Операция - то, что имеет смысл как основную операцию для конкретной задачи. Для сортировки основной операции сравнение. Для умножения матриц основная операция является умножением двух чисел.

Теперь вопрос, что делает детерминированный по сравнению со средним недетерминированным. Существует абстрактная вычислительная модель, мнимый компьютер, названный Turing machine(TM). Эта машина имеет конечное число состояний и бесконечную ленту, которая имеет дискретные ячейки, в которые конечное множество символов может быть записано и считано. В любой момент времени ТМ находится в одном из его состояний, и это смотрит на конкретную ячейку на ленте. В зависимости от того, что это читает из той ячейки, это может записать новый символ в ту ячейку, переместить ленту одна ячейка вперед или назад и войти в различное состояние. Это называют изменением состояния. Удивительно достаточно, путем тщательного построения состояний и переходов, можно разработать ТМ, который эквивалентен любой компьютерной программе, которая может быть записана. Поэтому это используется в качестве теоретической модели для доказательства вещей о том, какие компьютеры могут и не могут сделать.

существует два вида ТМ, которые касаются нас здесь: детерминированный и недетерминированный. Детерминированный ТМ только имеет один переход от каждого состояния для каждого символа, что это прочитывает ленту. Недетерминированный ТМ может иметь несколько таких переход, т.е. это в состоянии проверить несколько возможностей одновременно. Это - вид подобного порождения нескольких потоков. Различие - то, что недетерминированный ТМ может породить столько таких "потоков", сколько он хочет, в то время как на реальном компьютере только определенное количество потоков может быть выполнено за один раз (равный количеству центральных процессоров). В действительности компьютеры являются в основном детерминированными ТМ с конечными лентами. С другой стороны, недетерминированный ТМ не может быть физически понят, кроме, возможно, с квантовым компьютером.

было доказано, что любая проблема, которая может быть решена недетерминированным ТМ, может быть решена детерминированным ТМ. Однако не ясно, сколько времени потребуется. Оператор P=NP означает что, если проблема занимает время на недетерминированном ТМ, то можно создать детерминированный ТМ, который решил бы ту же проблему также в полиномиальное время. До сих пор никто не был в состоянии показать, что это может быть сделано, но никто не был в состоянии доказать, что это не может быть сделано, также.

полная NP проблема означает проблему NP X, такой, что любая проблема NP Y может быть уменьшена до X полиномиальным сокращением. Это подразумевает что, если кто-либо когда-нибудь предлагает полиномиально-разовое решение полной NP проблемы, которая также даст полиномиально-разовое решение любой проблемы NP. Таким образом это доказало бы это P=NP. С другой стороны, если кто-либо должен был доказать это P! =NP, тогда мы были бы уверены, что нет никакого способа решить проблему NP в полиномиальное время на стандартном компьютере.

примером полной NP проблемы является проблема нахождения присвоения истины, которое сделало бы булево выражение, содержащее n переменные верный.
В настоящий момент на практике любая проблема, которая занимает время на недетерминированном ТМ, может только быть сделана в экспоненциальное время на детерминированном ТМ или на стандартном компьютере.
, Например, единственный способ решить проблему присвоения истины состоит в том, чтобы попробовать 2^n возможности.

349
ответ дан Dima 23 November 2019 в 03:55
поделиться
  1. А yes-no проблема находится в [1 110] P ( время P olynomial), если ответ может быть вычислен в полиномиальное время.
  2. А yes-no проблема находится в [1 112] NP ( N на-детерминированном время P olynomial), если да, которым ответ может быть , проверил в полиномиальное время.

Интуитивно, мы видим что, если проблема находится в [1 115] P, то это находится в [1 116] NP. Учитывая потенциальный ответ для проблемы в [1 117] P, мы можем проверить ответ путем простого перевычисления ответа.

менее очевидный, и намного более трудный ответить, являются ли все проблемы в [1 118] NP в [1 119] P. То, что мы можем проверить, что ответ в полиномиальное время означает, что мы можем вычислить тот ответ в полиномиальное время?

существует большое количество важных проблем, которые, как известно, являются NP - завершены (в основном, если какие-либо эти проблемы, как доказывают, находятся в [1 121] P, то весь непер проблемы, как доказывают, находятся в [1 123] P). Если P = NP, то все эти проблемы, как будут доказывать, будут иметь эффективное (полиномиальное время) решение.

Большинство ученых верит тому P! = NP. Однако никакое доказательство еще не было представлено или для [1 128] P = NP или для P! = NP. Если кто-либо предоставит доказательство для любой догадки, они выиграют 1 миллион долларов США .

80
ответ дан Carlos F 23 November 2019 в 03:55
поделиться

Для предоставления самого простого ответа, я могу думать:

предположим у нас есть проблема, которая берет определенное число исходных данных и имеет различные потенциальные решения, которые могут или не могут решить проблему для данных исходных данных. Логическая загадка в журнале загадки была бы хорошим примером: исходные данные являются условиями ("George, не живет в синем или зеленом доме"), и потенциальное решение является списком операторов ("жизни George в желтом доме, выращивает горох и владеет собакой"). Известным примером является проблема Коммивояжера: учитывая список городов, и времена для получения от любого города до любого другого и ограничения по времени потенциальное решение было бы списком городов в порядке, продавец посещает их, и это работало бы, если бы сумма времени прохождения была меньше, чем ограничение по времени.

Такая проблема находится в NP, если мы можем эффективно проверить потенциальное решение, чтобы видеть, работает ли это. Например, учитывая список городов для продавца для посещения в порядке мы можем сложить времена для каждого прохождения между городами, и легко видеть, находится ли это под ограничением по времени. Проблема находится в P, если мы можем эффективно найти решение, если Вы существуете.

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

Поэтому проблема P=NP может быть выражена этот путь: Если можно проверить решение для проблемы вида, описанного выше эффективно, можно ли найти решение (или доказать ли, что нет ни одного), эффективно? Очевидный ответ, "Почему необходимо быть в состоянии?", и это в значительной степени, где вопрос стоит сегодня. Никто не был в состоянии доказать его так или иначе, и это беспокоит много математиков и программистов. Вот почему кто-либо, кто может доказать решение, подлежит миллиону долларов от Основы Claypool.

Мы обычно предполагаем, что P не равняется NP, что нет никакого общего способа найти решения. Если оказалось, что P=NP, много вещей изменится. Например, криптография стала бы невозможной, и с ним любой вид конфиденциальности или verifiability в Интернете. В конце концов, мы можем эффективно взять зашифрованный текст и ключ и произвести оригинальный текст, поэтому если P=NP мы могли бы эффективно найти ключ, не зная это заранее. Взламывание пароля стало бы тривиальным. С другой стороны, существуют целые классы планирования проблем и проблем распределения ресурсов, которые мы могли решить эффективно.

Вы, возможно, услышали полное NP описание. Полной NP проблемой является та, которая является NP (конечно), и имеет это интересное свойство: если это находится в P, каждая проблема NP, и таким образом, P=NP. Если Вы могли бы найти способ эффективно решить проблему Коммивояжера или логические загадки из журналов загадки, Вы могли эффективно решить что-либо в NP. Полная NP проблема, в некотором смысле, самый твердый вид проблемы NP.

Так, если можно найти эффективный общий метод решения для какой-либо полной NP проблемы или доказать, что не такой существует, слава и богатство является Вашей.

23
ответ дан David Thornley 23 November 2019 в 03:55
поделиться

Краткое изложение от моего скромного знания:

существуют некоторые легкие вычислительные проблемы (как нахождение кратчайшего пути между двумя точками в графике), который может быть вычислен довольно быстро (O (n^k), где n является размером входа, и k является константой (в случае графиков, это - количество вершин или краев)).

Другие проблемы, как нахождение пути, который пересекает каждую вершину в графике или получении закрытого ключа RSA от открытого ключа, более трудны (O (e^n)).

, Но CS говорят, говорит, что проблема состоит в том, что мы не можем 'преобразовать' недетерминированную Машину Тьюринга в детерминированную, мы можем, однако, преобразовать недетерминированные конечные автоматы (как regex синтаксический анализатор) в детерминированные (хорошо, Вы можете, но время выполнения машины займет много времени). Таким образом, мы должны попробовать каждый возможный путь (обычно умные преподаватели CS могут исключить несколько).

Это интересно, потому что ни у кого даже нет идеи решения. Некоторые говорят, что это верно, некоторые говорят, что это - ложь, но нет никакого согласия. Другая интересная вещь состоит в том, что решение было бы вредно для общественности/шифрований с закрытым ключом (как RSA). Вы могли повредить их так же легко, как генерация ключа RSA теперь.

И это - довольно вдохновляющая проблема.

9
ответ дан AjitZero 23 November 2019 в 03:55
поделиться

Нет очень, я могу добавить к какой и почему из P =? Часть NP вопроса, но в отношении доказательства. Мало того, что доказательство стоило бы некоторый дополнительный кредит, но это решит один из проблемы Тысячелетия . Интересный опрос был недавно проведен и , опубликованные результаты (PDF) определенно стоит считать в отношении предмета доказательства.

6
ответ дан Lucky 23 November 2019 в 03:55
поделиться

Во-первых, некоторые определения:

  • А конкретная проблема находится в P, если можно вычислить решение вовремя меньше чем n^k приблизительно для k, где n размер входа. Например, сортировка может быть сделана в n log n, который является меньше чем n^2, таким образом сортируя являются полиномиальным временем.

  • проблема А находится в NP, если там существует k таким образом, что там существует решение размера самое большее n^k, который можно проверить вовремя самое большее n^k. Возьмите с 3 окрасками из графиков: учитывая график, с 3 окрасками является список (вершина, цвет) пары, который имеет размер O(n), и можно проверить вовремя O(m) (или O(n^2)), есть ли у всех соседей различные цвета. Таким образом, график является 3-поддающимся окраске, только если существует короткое и с готовностью решение поддающееся проверке.

эквивалентным определением NP являются "проблемы, разрешимые машина Тьюринга N ondeterministic в [1 118] время P olynomial". В то время как это говорит Вам, куда название происходит от, оно не дает Вам то же интуитивное чувство того, на что похожи проблемы NP.

Примечание, что P является подмножеством NP: если можно найти решение в полиномиальное время, существует решение, которое может быть проверено в полиномиальное время - просто проверяют, что данное решение равно тому, которое можно найти.

, Почему вопрос P =? NP интересен? Ответить что, первые потребности видеть, каковы полные NP проблемы. Помещенный просто,

  • проблема А L полна NP, если (1) L находится в P и (2) алгоритм, который решает L, может использоваться для решения любой проблемы L' в NP; то есть, приведенный пример L' можно создать экземпляр L, который имеет решение, если и только если экземпляр L' имеет решение. Официально говоря, каждая проблема L' в NP приводима к L.

Примечание, что экземпляр L должен быть полиномиально-разовый вычислимый и иметь полиномиальный размер в размере L'; тот путь, решив полную NP проблему в полиномиальное время дает нам полиномиальное решение времени [1 120] весь проблемы непера.

Вот пример: предположите, что мы знаем, что с 3 окрасками из графиков NP-трудная проблема. Мы хотим доказать, что решение выполнимости булевых формул является NP-трудной проблемой также.

Для каждой вершины v, имейте две логических переменные v_h и v_l, и требование (v_h или v_l): каждая пара может только иметь значения {01, 10, 11}, о котором мы можем думать как цвет 1, 2 и 3.

Для каждого края (u, v), имеют требование что (u_h, u_l)! = (v_h, v_l). Таким образом,

not ((u_h and not u_l) and (v_h and not v_l) or ...) перечисление всех равных конфигураций и соглашения, что ни один из них не имеет место.

AND 'луг вместе все эти ограничения дают булеву формулу, которая имеет полиномиальный размер (O(n+m)). Можно проверить, что это занимает время для вычислений также: Вы делаете простой O(1) материал на вершину и на край.

, Если можно решить булеву формулу, я сделал, затем можно также решить график, окрашивающий: для каждой пары переменных v_h и v_l, позвольте цвету v быть тем, соответствующим значениям тех переменных. Конструкцией формулы у соседей не будет равных цветов.

Следовательно, если с 3 окрасками графиков полно NP, булева выполнимость формулы - также.

Мы знаем, что с 3 окрасками из графиков полно NP; однако, исторически мы узнали это первым проявлением полноты NP булевой выполнимости схемы и затем сокращения это к с 3 окрашиваемостью (вместо наоборот).

5
ответ дан Jonas Kölker 23 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: