Cố gắng hiểu P vs NP vs NP Complete vs NP Hard


38

Tôi đang cố gắng để hiểu những phân loại này và tại sao chúng tồn tại. Là sự hiểu biết của tôi phải không? Nếu không thì sao?

  1. P là độ phức tạp đa thức hoặc đối với một số thực không âm , chẳng hạn như , v.v ... Nếu một vấn đề thuộc về P, thì tồn tại ít nhất một thuật toán có thể giải quyết nó từ đầu trong thời gian đa thức. Ví dụ, tôi luôn có thể tìm ra nếu một số nguyên là số nguyên tố bằng cách lặp lại và kiểm tra tại mỗi bước nếu chia .O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn

  2. NP là độ phức tạp đa thức không xác định. Tôi thực sự không biết ý nghĩa của nó là không xác định. Tôi nghĩ rằng điều đó có nghĩa là dễ dàng xác minh trong thời gian đa thức, nhưng có thể hoặc không phải là thời gian đa thức để giải quyết từ đầu nếu chúng ta chưa biết câu trả lời. Vì nó thể giải được trong thời gian đa thức, tất cả các bài toán P cũng là các bài toán NP. Nhân tố số nguyên được trích dẫn như một ví dụ về NP, nhưng tôi không hiểu tại sao nó không phải là P, vì cá nhân hóa thử nghiệm cần có O(sqrt(n))thời gian.

  3. NP-Complete Tôi hoàn toàn không hiểu, nhưng Vấn đề nhân viên bán hàng du lịch được trích dẫn như một ví dụ về điều này. Nhưng theo tôi, vấn đề TSP có thể chỉ là NP, bởi vì nó cần một cái gì đó giống như để xác minh nếu bạn được đưa ra con đường phía trước.O(2n n2) time to solve, but O(n)

  4. NP-Hard tôi giả sử chỉ là đầy ẩn số. Khó kiểm chứng, khó giải quyết.


4
Bạn đã đọc câu hỏi trên CS.SE Định nghĩa của P, NP, NP-đầy đủ và NP-hard là gì? ?

Tôi chưa thấy liên kết đó, không. Tôi sẽ đọc nó, cảm ơn
Nakano

1
Câu trả lời của CS.SE khá gây cảm hứng, nhưng tôi nghĩ có thể đưa ra một lời giải thích rất ngắn gọn và không gây hiểu lầm về những điều khoản này có nghĩa gì mà không đi sâu vào chi tiết. @Nakano sẽ quan tâm đến câu trả lời ngắn gọn, "chính xác" hoặc bài đăng CS.SE đó có giải quyết được vấn đề của bạn không?
Ixrec

@MichaelT Tôi đã đọc qua liên kết đó và thấy nó thực sự dài dòng và không rõ ràng về một số điểm. Tôi cảm thấy như nó chỉ cho tôi nhiều câu hỏi hơn là câu trả lời.
Nakano

1
"Không xác định" có thể được hiểu là "đưa ra một lựa chọn máy tính chọn lựa chọn chính xác mỗi lần".
Thorbjørn Ravn Andersen

Câu trả lời:


39

Về cơ bản, bạn đúng về P và NP, nhưng không phải về NP-hard và NP-Complete.

Để bắt đầu, đây là các định nghĩa siêu súc tích của bốn lớp phức tạp trong câu hỏi:

  • P là lớp các vấn đề quyết định có thể được giải quyết trong thời gian đa thức bằng máy Turing xác định.

  • NP là lớp các vấn đề quyết định có thể được giải quyết trong thời gian đa thức bằng máy Turing không xác định. Tương tự, đó là lớp các vấn đề có thể được xác minh trong thời gian đa thức bằng máy Turing xác định.

  • NP-hard là loại vấn đề quyết định mà tất cả các vấn đề trong NP có thể được giảm xuống trong thời gian đa thức bằng máy Turing xác định.

  • NP-Complete là giao điểm của NP-hard và NP. Tương tự, NP-Complete là lớp các vấn đề quyết định trong NP mà tất cả các vấn đề trong NP có thể được giảm xuống trong thời gian đa thức bằng máy Turing xác định.

Và đây là sơ đồ Euler từ Wikipedia cho thấy mối quan hệ giữa bốn lớp này (giả sử rằng P không bằng NP):

nhập mô tả hình ảnh ở đây

Phần mà tôi cho rằng bạn không quen thuộc hoặc bối rối nhất là khái niệm "giảm thời gian đa thức" từ bài toán X sang bài toán Y. Việc giảm từ X thành Y chỉ đơn giản là thuật toán A giải quyết X bằng cách sử dụng một số thuật toán B khác giải quyết vấn đề Y. Việc giảm này được gọi là "giảm thời gian đa thức" nếu tất cả các phần của A không phải là B có độ phức tạp về thời gian đa thức. Như một ví dụ tầm thường, bài toán tìm phần tử nhỏ nhất trong một mảng có thể giảm thời gian liên tục cho bài toán sắp xếp, vì bạn có thể sắp xếp mảng và sau đó trả về phần tử đầu tiên của mảng được sắp xếp.

Một điều dễ bỏ lỡ về định nghĩa NP-hard là việc giảm đi từ các vấn đề NP sang vấn đề NP-hard, nhưng không nhất thiết phải ngược lại . Điều này có nghĩa là các vấn đề NP-hard có thể nằm trong NP hoặc trong một lớp phức tạp cao hơn nhiều (như bạn có thể thấy từ sơ đồ Euler), hoặc chúng thậm chí có thể không phải là vấn đề có thể quyết định. Đó là lý do tại sao mọi người thường nói một cái gì đó như "NP-hard có nghĩa là ít nhất là khó như NP" khi cố gắng giải thích những thứ này một cách không chính thức.

Vấn đề tạm dừng là một ví dụ điển hình cho vấn đề NP-hard rõ ràng không có trong NP, như Wikipedia giải thích :

Thật dễ dàng để chứng minh rằng vấn đề tạm dừng là NP-hard nhưng không hoàn thành NP. Ví dụ, vấn đề thỏa mãn Boolean có thể được giảm xuống thành vấn đề tạm dừng bằng cách chuyển đổi nó thành mô tả của máy Turing thử tất cả các phép gán giá trị thật và khi nó tìm thấy một công thức thỏa mãn công thức thì nó dừng lại và nếu không nó sẽ đi vào một vòng lặp vô hạn. Cũng dễ dàng nhận thấy rằng vấn đề tạm dừng không nằm ở NP vì tất cả các vấn đề trong NP đều có thể quyết định được trong một số lượng hoạt động hữu hạn, trong khi nói chung, vấn đề tạm dừng là không thể giải quyết được.


3
@Nakano Theo trực giác, đó là một "sự giảm bớt" theo nghĩa là một vấn đề đang được coi là một vấn đề phụ của một số vấn đề khác. Thực tế là một số mức giảm này làm tăng độ phức tạp thay vì giảm nó thông qua sự lựa chọn "dự án con" kém, đơn giản là bạn sẽ không bao giờ sử dụng các mức giảm này trong bất kỳ mã thế giới thực nào. Mặc dù thành thật mà nói, NP-hard đánh tôi là một lớp học kỳ lạ và không thú vị lắm; Có thể sẽ hiệu quả hơn nếu bỏ qua nó và chỉ nghĩ về NP-đầy đủ khi tập hợp các vấn đề NP mà tất cả các vấn đề NP khác giảm xuống.
Ixrec

1
@Nakano stackoverflow.com/questions/12637582/... Tôi tin rằng câu trả lời ngắn gọn là khi người ta nói về nguyên nhân tử là NP họ thường nói chuyện về số nguyên thực sự khổng lồ, mà bạn thường bắt đầu làm bằng chứng lớn-O với n là "số bit mà số nguyên chiếm trong bộ nhớ" thay vì "số lượng số nguyên bạn truyền vào hàm".
Ixrec

1
@Nakano Có lẽ sẽ đáng để hỏi một câu hỏi mới cụ thể về vấn đề nhân số nguyên này nếu câu hỏi SO tôi liên kết và nhận xét của tôi không đủ để giải quyết vấn đề đó cho bạn.
Ixrec

2
@Nakano: Trong ký hiệu big-O, nthước đo cho kích thước của đầu vào (số phần tử, byte, chữ số, v.v.), không phải giá trị của đầu vào.
Bart van Ingen Schenau

2
@Nakano Câu trả lời ngắn gọn là bạn không sao, và đây là lý do tại sao khi thực hiện phẫu thuật giảm đau phức tạp về thời gian, bạn luôn cần chỉ định n nghĩa là gì . Khiếu nại rằng n là "kích thước của đầu vào" chỉ là một bản tóm tắt ngắn gọn về cách chúng ta thường chọn để xác định n. Nó không phải là một phần của các định nghĩa nghiêm ngặt về ký hiệu big-O hoặc độ phức tạp thời gian. Tôi tin rằng bạn đã đúng khi nói rằng hệ số nguyên là O (sqrt (n)) khi n là giá trị của đầu vào. Nó chỉ xảy ra rằng các kết quả phức tạp trong đó n có nghĩa là kích thước thường hữu ích hơn rất nhiều trong thực tế so với n có nghĩa là giá trị.
Ixrec

7

Nhân tố số nguyên được trích dẫn như một ví dụ về NP, nhưng tôi không hiểu tại sao nó không phải là P, vì cá nhân hóa dùng thử mất thời gian O (sqrt (n)).

Đối với mục đích của các lớp phức tạp, nđộ dài của đầu vào. Vì vậy, nếu bạn muốn tính số nguyên k, nthì không , knhưng log ksố bit (hoặc bất cứ thứ gì) cần để ghi lại số. Vì vậy, hệ số nguyên là O(sqrt(k))như bạn nói, nhưng đây là .O(sqrt(2n))O(2(n/2))

NP-Hard tôi giả sử chỉ là đầy ẩn số. Khó kiểm chứng, khó giải quyết.

Không. NP-Hard chỉ đơn thuần là vấn đề khó giải quyết như thế nào.

Vấn đề NP-Hard ít nhất là khó nhất là vấn đề khó nhất trong NP. Chúng tôi biết rằng chúng ít nhất là khó, bởi vì nếu chúng tôi có thuật toán đa thức thời gian cho một vấn đề NP-Hard, chúng tôi có thể điều chỉnh thuật toán đó cho bất kỳ vấn đề nào trong NP.

NP-Complete Tôi không hiểu gì cả

NP-Complete có nghĩa là một vấn đề là cả NP và NP-Hard. Điều đó có nghĩa là chúng ta có thể xác minh một giải pháp nhanh chóng (NP), nhưng ít nhất nó cũng khó như vấn đề khó nhất trong NP (NP-Hard).

Tôi thực sự không biết ý nghĩa của nó là không xác định.

Không xác định là một định nghĩa thay thế của NP. Một máy xử lý không xác định có hiệu quả có thể tự nhân đôi bất cứ lúc nào và mỗi máy nhân đôi có một đường dẫn thực hiện khác nhau. Theo định nghĩa này, NP là tập hợp các vấn đề có thể được giải quyết trong thời gian đa thức bằng máy tính hơn là có thể tự do sao chép chính nó. Hóa ra đây chính xác là cùng một tập hợp các vấn đề có thể được xác minh trong thời gian đa thức.


Vì vậy, các thuật toán $ O (n ^ k) $ có thể là vấn đề NP không?
Nakano

klà một số thực không đổi? Vâng. Tất cả các vấn đề P cũng là vấn đề NP. Rõ ràng, bất cứ điều gì bạn có thể giải quyết trong thời gian đa thức cũng có thể được xác minh trong thời gian đa thức.
Winston Ewert

Làm thế nào là chiều dài / kích thước thực sự được xác định ở đây? Ví dụ, tôi chỉ có thể viết $ n $ trong một cơ sở lớn và giảm độ dài của nó khi viết. Điều gì về các vấn đề không giải quyết rõ ràng với số nguyên, nhưng nói biểu đồ với các đỉnh $ V $ và các cạnh $ E $, v.v.
Nakano

@Nakano, thực sự là một cơ sở lớn sẽ không thay đổi nó, bởi vì nó sẽ chỉ là một sự khác biệt yếu tố không đổi. Vì vậy, nó sẽ không ảnh hưởng đến đa thức so với không đa thức. Tuy nhiên, nếu bạn viết số đó bằng unary, thì nó sẽ thay đổi nó.
Winston Ewert

2
@Nakano, hmm ... Tôi không dám giải thích các lớp phức tạp cho một đứa trẻ năm tuổi. : P
Winston Ewert

5

Điều đầu tiên cần hiểu là PNP phân loại ngôn ngữ , không phải vấn đề . Để hiểu điều này có nghĩa là gì, chúng ta cần một số định nghĩa khác trước.

Một bảng chữ cái là một tập hợp hữu hạn không trống rỗng của các biểu tượng.

{ 0, 1} là một bảng chữ cái như bộ ký tự ASCII. {} không phải là một bảng chữ cái vì nó trống. N (các số nguyên) không phải là một bảng chữ cái vì nó không hữu hạn.

Hãy Σ là một bảng chữ cái. Một nối ra lệnh của một số hữu hạn các ký tự từ Σ được gọi là một từ trên Σ .

Chuỗi 101là một từ trên bảng chữ cái { 0, 1}. Các từ trống (thường được viết như ε ) là một từ trong bất kỳ bảng chữ cái. Chuỗi penguinlà một từ trên bảng chữ cái có chứa các ký tự ASCII. Các ký hiệu thập phân của π số không phải là một từ trên bảng chữ cái { ., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9} bởi vì nó không phải là hữu hạn.

Độ dài của một từ w , được viết là | w |, là số ký hiệu trong đó.

Ví dụ: | hello| = 5 và | ε | = 0. Với mọi từ w , | w | ∈ N và do đó hữu hạn.

Hãy Σ là một bảng chữ cái. Tập Σ * chứa tất cả các từ trên Σ , bao gồm ε . Tập Σ + chứa tất cả các từ trên Σ , trừ ε . Đối với nN , Σ n là tập hợp các từ có độ dài n .

Đối với mỗi bảng chữ cái Σ , Σ *Σ + là vô hạn tập hợp đếm được . Đối với các ký tự ASCII bộ Σ ASCII , các biểu thức thông thường .*.+biểu thị Σ ASCII *Σ ASCII + tương ứng.

{ 0, 1} 7 là tập hợp các mã ASCII 7-bit { 0000000, 0000001, ..., 1111111}. { 0, 1} 32 là tập hợp các giá trị nguyên 32 bit.

Hãy Σ là một bảng chữ cái và LΣ * . L được gọi là ngôn ngữ trên Σ .

Đối với một bảng chữ cái Σ , tập rỗng và Σ * là ngôn ngữ tầm thường trên Σ . Các cựu thường được gọi là ngôn ngữ trống rỗng . Ngôn ngữ trống {} và ngôn ngữ chỉ chứa từ trống { ε } là khác nhau.

Tập hợp con của { 0, 1} 32 tương ứng với các giá trị dấu phẩy động không phải NaN IEEE 754 là ngôn ngữ hữu hạn.

Ngôn ngữ có thể có vô số từ nhưng mọi ngôn ngữ đều có thể đếm được. Tập hợp các chuỗi { 1, 2, ...} biểu thị số nguyên trong ký hiệu thập phân là một ngôn ngữ vô hạn trong bảng chữ cái { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Tập hợp vô hạn các chuỗi { 2, 3, 5, 7, 11, 13, ...} biểu thị các số nguyên tố trong ký hiệu thập phân là một tập hợp con thích đó. Ngôn ngữ chứa tất cả các từ khớp với biểu thức chính quy [+-]?\d+\.\d*([eE][+-]?\d+)?là ngôn ngữ trong bộ ký tự ASCII (biểu thị một tập hợp con của các biểu thức dấu phẩy động hợp lệ như được xác định bởi ngôn ngữ lập trình C).

Không có ngôn ngữ chứa tất cả các số thực (trong bất kỳ ký hiệu nào) vì tập hợp các số thực không thể đếm được.

Hãy Σ là một bảng chữ cái và LΣ * . Một máy D quyết định L nếu cho mỗi đầu vào wΣ * nó tính toán hàm đặc trưng χ L ( w ) trong thời gian hữu hạn. Hàm đặc trưng được định nghĩa là

χ L : Σ * → {0, 1}
     w   ↦ 1,   wL 
         0, nếu không.

Một máy như vậy được gọi là một người quyết định cho L . Chúng tôi viết “ D ( w ) = x ” cho “cho w , D kết quả đầu ra x ”.

Có nhiều mẫu máy. Một cái chung nhất được sử dụng thực tế hiện nay là mô hình của máy Turing . Một máy Turing có bộ lưu trữ tuyến tính không giới hạn được nhóm vào các ô. Mỗi ô có thể chứa chính xác một ký hiệu của bảng chữ cái tại bất kỳ thời điểm nào. Máy Turing thực hiện tính toán của nó như một chuỗi các bước tính toán. Trong mỗi bước, nó có thể đọc một ô, có thể ghi đè giá trị của nó và di chuyển đầu đọc / ghi theo một vị trí sang ô bên trái hoặc bên phải. Những hành động mà máy sẽ thực hiện được điều khiển bởi một máy tự động trạng thái hữu hạn.

Một máy truy cập ngẫu nhiên với một bộ hướng dẫn hữu hạn và bộ nhớ không giới hạn là một kiểu máy khác mạnh mẽ như mô hình máy Turing.

Vì lợi ích của cuộc thảo luận này, chúng tôi sẽ không làm phiền chúng tôi với mô hình máy chính xác mà chúng tôi sử dụng mà chỉ nói rằng máy có bộ điều khiển xác định hữu hạn, lưu trữ không giới hạn và thực hiện tính toán như một chuỗi các bước có thể đếm được.

Vì bạn đã sử dụng nó trong câu hỏi của mình, tôi cho rằng bạn đã quen thuộc với ký hiệu của big big-O nên đây chỉ là một cách làm mới nhanh chóng.

Đặt f : N → là một hàm. Tập O ( f ) chứa tất cả các chức năng g : NN mà có tồn tại các hằng số n 0NcN sao cho với mỗi nN với n > n 0 đúng là g ( n ) ≤ c f ( n ).

Bây giờ chúng tôi đã chuẩn bị để tiếp cận câu hỏi thực sự.

Lớp P chứa tất cả các ngôn ngữ L mà tồn tại một máy Turing D rằng quyết định L và một hằng số kN sao cho với mỗi đầu vào w , D tạm dừng sau ít nhất T (| w |) bước cho một hàm TO ( nn k ).

O ( nn k ), trong khi về mặt toán học, không thuận tiện để viết và đọc, hầu hết mọi người - thành thật mà nói, mọi người ngoại trừ bản thân tôi - thường viết đơn giản là O ( n k ).

Lưu ý rằng ràng buộc phụ thuộc vào độ dài của w . Do đó, đối số bạn đưa ra cho ngôn ngữ của các số nguyên tố chỉ đúng với các số trong bảng mã unaray , trong đó đối với mã hóa w của một số n , độ dài của mã hóa | w | tỷ lệ với n . Không ai sẽ sử dụng một mã hóa như vậy trong thực tế. Tuy nhiên, sử dụng một thuật toán tiên tiến hơn là chỉ đơn giản là thử tất cả các yếu tố có thể, ngôn ngữ của các số nguyên tố vẫn nằm trong P nếu các đầu vào được mã hóa ở dạng nhị phân (hoặc bất kỳ cơ sở nào khác). (Mặc dù có sự quan tâm lớn, nhưng điều này chỉ có thể được chứng minh bởi Manindra Agrawal, Neeraj Kayal và Nitin Saxena trong một bài báo giành giải thưởng năm 2004 để bạn có thể đoán rằng thuật toán này không đơn giản lắm.)

Các ngôn ngữ tầm thường {} và Σ * và ngôn ngữ không tầm thường { ε } rõ ràng trong P (đối với bất kỳ bảng chữ cái Σ ). Bạn có thể viết các hàm trong ngôn ngữ lập trình yêu thích của bạn, lấy một chuỗi làm đầu vào và trả về một boolean cho biết chuỗi đó có phải là một từ trong ngôn ngữ cho mỗi chuỗi này không và chứng minh rằng hàm của bạn có độ phức tạp thời gian chạy đa thức?

Mỗi thường xuyên ngôn ngữ (một ngôn ngữ mô tả bởi một regular expression) là P .

Hãy Σ là một bảng chữ cái và LΣ * . Một máy V mà phải mất một tuple được mã hóa của hai chữ w , cΣ * và đầu ra là 0 hoặc 1 sau một số hữu hạn các bước là một người xác minh cho L nếu nó có các thuộc tính sau.

  • Given ( w , c ), V đầu ra 1 chỉ nếu wL .
  • Đối với mỗi wL , tồn tại một cΣ *V ( w , c ) = 1.

Chữ c trong định nghĩa trên được gọi là nhân chứng (hoặc chứng chỉ ).

Một xác minh được phép cung cấp cho âm tính giả vì sự làm chứng sai ngay cả khi w thực sự là trong L . Tuy nhiên, nó không được phép đưa ra dương tính giả. Nó cũng được yêu cầu rằng đối với mỗi từ trong ngôn ngữ, tồn tại ít nhất một nhân chứng.

Đối với ngôn ngữ COMPOSITE, có chứa mã hóa thập phân của tất cả các số nguyên không phải là số nguyên tố, một nhân chứng có thể là một yếu tố. Ví dụ, (659, 709)là một nhân chứng cho 467231∈ COMPOSITE. Bạn có thể dễ dàng xác minh rằng trên một tờ giấy trong khi không có nhân chứng đưa ra, việc chứng minh rằng 467231 không phải là số nguyên tố sẽ khó khăn nếu không sử dụng máy tính.

Chúng tôi đã không nói bất cứ điều gì về cách một nhân chứng thích hợp có thể được tìm thấy. Đây là phần không xác định.

Lớp NP chứa tất cả các ngôn ngữ L mà tồn tại một máy Turing V rằng thẩm tra L và một hằng số kN như vậy mà cho tất cả các đầu vào ( w , c ), V tạm dừng sau ít nhất T (| w bước cho một chức năng |) TO ( nn k ).

Lưu ý rằng định nghĩa trên ngụ ý rằng với mỗi wL tồn tại một nhân chứng c với | c | ≤ T (| w |). (Máy Turing không thể nhìn vào nhiều biểu tượng của nhân chứng hơn.)

NP là siêu khối của P (tại sao?). Người ta không biết liệu có tồn tại các ngôn ngữ mà là trong NP nhưng không phải trong P .

Yếu tố số nguyên không phải là một ngôn ngữ mỗi se. Tuy nhiên, chúng ta có thể xây dựng một ngôn ngữ đại diện cho vấn đề quyết định liên quan đến nó. Nghĩa là, một ngôn ngữ chứa tất cả các bộ dữ liệu ( n , m ) sao cho n có hệ số d với dm . Hãy để chúng tôi gọi ngôn ngữ này YẾU TỐ. Nếu bạn có một thuật toán để quyết định FACTOR, nó có thể được sử dụng để tính toán một hệ số đầy đủ chỉ với chi phí đa thức bằng cách thực hiện tìm kiếm nhị phân đệ quy cho từng thừa số nguyên tố.

Thật dễ dàng để chỉ ra rằng FACTOR nằm trong NP . Một nhân chứng thích hợp chỉ đơn giản là nhân tố d và tất cả các trình xác minh sẽ phải làm là xác minh rằng dmn mod d = 0. Tất cả điều này có thể được thực hiện trong thời gian đa thức. (Hãy nhớ, một lần nữa, đó là độ dài của mã hóa được tính và đó là logarit trong n .)

Nếu bạn có thể chỉ ra rằng FACTOR cũng ở P , bạn có thể chắc chắn nhận được nhiều giải thưởng hấp dẫn. (Và bạn đã phá vỡ một phần đáng kể của mật mã ngày nay.)

Đối với mọi ngôn ngữ trong NP , có một thuật toán brute-force quyết định nó một cách xác định. Nó chỉ đơn giản là thực hiện một tìm kiếm toàn diện trên tất cả các nhân chứng. (Lưu ý rằng độ dài tối đa của một nhân chứng bị giới hạn bởi một đa thức.) Vì vậy, thuật toán của bạn để quyết định PRIMES thực sự là một thuật toán mạnh mẽ để quyết định COMPOSITE.

Để giải quyết câu hỏi cuối cùng của bạn, chúng tôi cần giới thiệu giảm . Giảm là một khái niệm rất mạnh mẽ của khoa học máy tính lý thuyết. Giảm một vấn đề này sang vấn đề khác về cơ bản có nghĩa là giải quyết một vấn đề bằng cách giải quyết vấn đề khác.

Hãy Σ là một bảng chữ cái và AB được ngôn ngữ trên Σ . Mộtthời gian đa thức nhiều-one khử đến B nếu có tồn tại một hàm f : Σ *Σ * với các thuộc tính sau.

  • wA   ⇔   f ( w ) ∈ B   cho tất cả các wΣ * .
  • Hàm f có thể được tính bằng máy Turing cho mọi đầu vào w trong một số bước được giới hạn bởi một đa thức trong | w |.

Trong trường hợp này, chúng tôi viết Mộtp B .

Ví dụ: Đặt A là ngôn ngữ chứa tất cả các biểu đồ (được mã hóa dưới dạng ma trận kề) có chứa một hình tam giác. (Một tam giác là một chu kỳ có độ dài 3.) Gọi thêm B là ngôn ngữ chứa tất cả các ma trận có dấu vết khác không. (Các dấu vết của một ma trận là tổng hợp của các yếu tố đường chéo chính của nó.) Sau đó, A là đa thức thời gian nhiều một rút gọn về B . Để chứng minh điều này, chúng ta cần tìm một hàm biến đổi thích hợp f . Trong trường hợp này, chúng ta có thể đặt f để tính công suất thứ 3 của ma trận kề. Điều này đòi hỏi hai sản phẩm ma trận, mỗi sản phẩm có độ phức tạp đa thức.

Đó là trivially đúng là Lp L . (Bạn có thể chứng minh chính thức không?)

Chúng tôi sẽ áp dụng điều này cho NP ngay bây giờ.

Một ngôn ngữ LNP -hard khi và chỉ khi L '≤ p L cho mọi ngôn ngữ L ' ∈ NP .

Một ngôn ngữ NP -hard có thể có hoặc không có trong chính NP .

Một ngôn ngữ LNP -complete khi và chỉ khi

  • LNP
  • LNP -hard.

Ngôn ngữ NP -complete nổi tiếng nhất là SAT. Nó chứa tất cả các công thức boolean có thể được thỏa mãn. Ví dụ: ( ab ) ∧ ( a ∨ ¬ b ) ∈ SAT. Một nhân chứng hợp lệ là { a = 1, b = 0}. Công thức ( ab ) ∧ ( ab ) ∧ ¬ b ∉ SAT. (Làm thế nào bạn sẽ chứng minh điều đó?)

Không khó để chỉ ra rằng SAT ∈ NP . Để cho thấy NP -hardness of SAT là một số công việc nhưng nó đã được thực hiện vào năm 1971 bởi Stephen Cook .

Khi một ngôn ngữ NP -complete đã được biết đến, việc hiển thị độ linh hoạt NP của các ngôn ngữ khác là tương đối đơn giản . Nếu ngôn ngữ Một được biết đến là NP -Hard, sau đó cho thấy rằng Ap B cho thấy BNP -Hard, quá (thông qua transitivity của “≤ p ”). Năm 1972 Richard Karp đã công bố một danh sách 21 ngôn ngữ mà ông có thể hiển thị là NP- Hoàn thành thông qua (transitive) giảm SAT. (Đây là bài viết duy nhất trong câu trả lời này mà tôi thực sự khuyên bạn nên đọc. Không giống như những bài khác, nó không khó hiểu và đưa ra một ý tưởng rất hay về cách chứng minh tính đồng bộ NP thông qua việc giảm hoạt động.)

Cuối cùng, một bản tóm tắt ngắn. Chúng ta sẽ sử dụng các ký hiệu NPHNPC để biểu thị các lớp ngôn ngữ NP -hard và NP -complete tương ứng.

  • PNP
  • NPCNPNPCNPH , thực NPC = NPNPH theo định nghĩa
  • ( MộtNP ) ∧ ( BNPH ) ⇒   Mộtp B

Lưu ý rằng sự bao gồm NPCNP là thích hợp ngay cả trong trường hợp đó P = NP . Để thấy điều này, hãy làm rõ rằng không có ngôn ngữ không tầm thường nào có thể được giảm xuống thành một ngôn ngữ tầm thường và có những ngôn ngữ tầm thường trong P cũng như các ngôn ngữ không tầm thường trong NP . Đây là một trường hợp góc (không thú vị), mặc dù.

Phụ lục

Nguồn chính của bạn nhầm lẫn dường như thể là bạn đang nghĩ đến việc các “ n ” trong “ O ( nf ( n ))” như giải thích của đầu vào của một thuật toán khi nó thực sự đề cập đến chiều dài của đầu vào. Đây là một sự khác biệt quan trọng bởi vì nó có nghĩa là độ phức tạp tiệm cận của thuật toán phụ thuộc vào mã hóa được sử dụng cho đầu vào.

Tuần này, một kỷ lục mới cho thủ tướng Mersenne lớn nhất được biết đến đã đạt được. Số nguyên tố lớn nhất hiện được biết đến là 2 74 207 281 - 1. Con số này quá lớn đến nỗi khiến tôi đau đầu nên tôi sẽ sử dụng số nhỏ hơn trong ví dụ sau: 2 31 - 1 = 2 147 483 647. Nó có thể được mã hóa theo những cách khác nhau.

  • theo số mũ Mersenne của nó dưới dạng số thập phân: 31(2 byte)
  • dưới dạng số thập phân: 2147483647(10 byte)
  • dưới dạng số đơn nguyên: 11111…11trong đó số được thay thế bằng 2 147 483 640 1s (gần 2 GiB)

Tất cả các chuỗi này mã hóa cùng một số và được cung cấp bất kỳ chuỗi nào trong số này, chúng ta có thể dễ dàng xây dựng bất kỳ mã hóa nào khác có cùng số. (Bạn có thể thay thế mã hóa thập phân bằng nhị phân, bát phân hoặc thập lục phân nếu bạn muốn. Nó chỉ thay đổi độ dài theo một yếu tố không đổi.)

Thuật toán ngây thơ để kiểm tra tính nguyên thủy chỉ là đa thức cho các mã hóa đơn nguyên. Các thử nghiệm AKS tính nguyên là đa thức cho số thập phân (hoặc bất kỳ cơ sở khác b ≥ 2). Phép thử nguyên thủy Lucas-Lehmer là thuật toán được biết đến nhiều nhất cho các số nguyên tố Mersenne M p với p một số nguyên tố lẻ nhưng nó vẫn theo cấp số nhân về độ dài của mã hóa nhị phân của số mũ Mersenne p (đa thức tính theo p ).

Nếu chúng ta muốn nói về sự phức tạp của một thuật toán, điều rất quan trọng là chúng ta rất rõ ràng chúng ta sử dụng biểu diễn nào. Nói chung, người ta có thể giả định rằng mã hóa hiệu quả nhất được sử dụng. Đó là, nhị phân cho số nguyên. (Lưu ý rằng không phải mọi số nguyên tố đều là số nguyên tố Mersenne nên sử dụng số mũ Mersenne không phải là sơ đồ mã hóa chung.)

Trong mật mã lý thuyết, nhiều thuật toán được chính thức thông qua một chuỗi k 1 s hoàn toàn vô dụng làm tham số đầu tiên. Thuật toán không bao giờ nhìn vào tham số này nhưng nó cho phép nó chính thức là đa thức tính bằng k , là tham số bảo mật được sử dụng để điều chỉnh bảo mật của thủ tục.

Đối với một số vấn đề mà ngôn ngữ quyết định trong mã hóa nhị phân là NP -complete, ngôn ngữ quyết định không còn là NP -complete nếu mã hóa các số nhúng được chuyển thành đơn nguyên. Các ngôn ngữ quyết định cho các vấn đề khác vẫn còn NP -complete. Cái sau được gọi là NP -complete mạnh mẽ . Ví dụ nổi tiếng nhất là bin đóng gói .

Cũng rất thú vị khi xem mức độ phức tạp của thuật toán thay đổi nếu đầu vào được nén . Đối với ví dụ về các số nguyên tố Mersenne, chúng ta đã thấy ba bảng mã, mỗi mã được nén theo logarit hơn so với tiền thân của nó.

Năm 1983, Hana Galperin và Avi Wigderson đã viết một bài báo thú vị về sự phức tạp của các thuật toán đồ thị phổ biến khi mã hóa đầu vào của đồ thị được nén theo logarit. Đối với những đầu vào này, ngôn ngữ của đồ thị chứa một hình tam giác từ phía trên (nơi rõ ràng là P ) đột nhiên trở thành NP -complete.

Và đó là vì các lớp ngôn ngữ như PNP được xác định cho các ngôn ngữ , không phải cho các vấn đề .


Câu trả lời này có lẽ không hữu ích cho mức độ hiểu biết của người hỏi. Đọc các câu trả lời khác và xem Nanako đang vật lộn với điều gì. Bạn có nghĩ rằng câu trả lời này sẽ giúp anh ấy / cô ấy?
Andres F.

Câu trả lời này có thể không giúp ích cho OP, nhưng chắc chắn sẽ giúp những độc giả khác (bao gồm cả bản thân tôi).
Gabriel

4

Tôi sẽ cố gắng cung cấp cho bạn ít định nghĩa không chính thức cho cùng.

Vấn đề P: các vấn đề có thể được giải quyết trong thời gian đa thức. Chứa các vấn đề có thể được giải quyết một cách hiệu quả.

Vấn đề NP: các vấn đề có thể được xác minh trong thời gian đa thức. Ví dụ: Nhân viên bán hàng du lịch, thiết kế mạch. Các vấn đề NP là loại câu đố giống như (như sudoku). Đưa ra một giải pháp chính xác cho vấn đề, chúng ta có thể kiểm tra giải pháp của mình rất nhanh nhưng nếu chúng ta thực sự cố gắng giải quyết thì có thể sẽ mất mãi mãi.

Bây giờ, P vs NP thực sự hỏi liệu một vấn đề mà giải pháp của họ có thể nhanh chóng được kiểm tra là chính xác hay không, thì luôn luôn có một cách nhanh chóng để giải quyết nó. Do đó viết bằng thuật ngữ toán học: NP có phải là tập con của P hay không?

Bây giờ trở lại NP hoàn tất: đây là những vấn đề thực sự khó khăn của các vấn đề NP. Do đó, nếu có cách nhanh hơn để giải quyết NP hoàn tất thì NP hoàn thành trở thành các vấn đề P và NP sụp đổ thành P.

NP cứng: các vấn đề thậm chí không thể được kiểm tra trong thời gian đa thức là khó khăn. Ví dụ, chọn nước cờ tốt nhất trong cờ vua là một trong số đó.

Nếu một cái gì đó vẫn chưa rõ ràng, hãy thử xem video này: https://www.youtube.com/watch?v=YX40hbAHx3s

Tôi hy vọng điều này sẽ cung cấp một số đường viền mờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.