Tại sao không lấy biểu diễn đơn của các số trong thuật toán số?


15

Thuật toán thời gian giả đa thức là thuật toán có thời gian chạy đa thức trên giá trị đầu vào (độ lớn) nhưng thời gian chạy theo hàm mũ trên kích thước đầu vào (số bit).

Ví dụ, kiểm tra xem một số có phải là số nguyên tố hay không, yêu cầu một vòng lặp thông qua các số từ 2 đến và kiểm tra xem mod có bằng 0 hay không. Nếu mod mất thời gian O (1), độ phức tạp thời gian tổng thể sẽ là O (n).nn1n i

Nhưng nếu chúng ta đặt là số bit cần thiết để ghi đầu vào thì (nhị phân) nên và thời gian chạy của bài toán sẽ là O ( ) theo cấp số nhân.xx=lognn=2x2x

Câu hỏi của tôi là, nếu chúng ta xem xét biểu diễn đơn nhất của đầu vào , thì luôn luôn và sau đó thời gian giả đa thức sẽ bằng với độ phức tạp thời gian đa thức. Vậy tại sao chúng ta không bao giờ làm điều này?nx=n

Hơn nữa vì có một thuật toán thời gian giả đa thức cho ba lô, bằng cách lấy , ba lô sẽ là đa thức do kết quả P = NPx=n


3
Trên thực tế, chúng tôi làm điều này, chỉ không thường xuyên. Vì những lý do tương tự, chúng ta thường không đối phó với các ngôn ngữ đơn nhất, nhưng có nhiều kết quả thú vị liên quan đến những con thú này. Bạn đã nhìn vào nó?
André Souza Lemos

2
Có, nếu bạn lấy đi sự khác biệt giữa kích thước và cường độ, bạn sẽ mất tất cả các khái niệm được xác định dựa trên sự khác biệt đó.
André Souza Lemos

7
Bởi vì nó đặt con quỷ vào một chiếc váy đẹp. Nó không làm cho mọi thứ nhanh hơn, nó chỉ làm cho "thời gian chạy phức tạp" trở nên vô nghĩa.
Raphael

4
@Drupalist Vấn đề về chiếc ba lô đơn nguyên thực sự không được biết đến là NP hoàn chỉnh bởi vì việc giảm bình thường đối với vấn đề về chiếc ba lô giả định rằng các con số được viết ra dưới dạng nhị phân. Nếu bạn cố gắng thực hiện giảm tiêu chuẩn nhưng viết các số bằng unary, mức giảm không thể được tính trong thời gian đa thức. Kết quả là, bài toán ba lô đơn phương có thể giải được trong thời gian đa thức không có nghĩa là P = NP.
templatetypedef

2
Bạn có thể muốn kiểm tra các câu trả lời khác được gắn thẻ giả đa thức , đặc biệt là câu trả lời này .
Raphael

Câu trả lời:


17

Điều này có nghĩa là ba lô đơn nguyên nằm trong P. Điều đó không có nghĩa là ba lô (với số được mã hóa nhị phân) nằm trong P.

Knapsack được biết là NP-đầy đủ. Nếu bạn chỉ ra rằng chiếc ba lô nằm trong P, điều đó sẽ cho thấy P = NP.

Nhưng bạn đã không chứng minh rằng ba lô là ở P. Bạn đã chỉ ra rằng ba lô đơn nguyên ở P. Tuy nhiên, ba lô đơn nguyên không được biết là hoàn chỉnh NP (thực sự, nghi ngờ tiêu chuẩn là rất có thể nó không hoàn thành NP ). Do đó, việc đặt ba lô đơn phương vào P không có nghĩa là P = NP.


Vì vậy, vấn đề nào chúng ta nên quan tâm nhiều hơn, ba lô hoặc ba lô đơn phương? Nếu động lực của bạn dựa trên mối quan tâm thực tế, thì câu trả lời sẽ phụ thuộc vào kích thước của những con số bạn muốn giải quyết vấn đề về chiếc ba lô cho: nếu chúng lớn, thì bạn chắc chắn quan tâm nhiều hơn đến chiếc ba lô hơn là chiếc ba lô đơn phương. Nếu động lực của bạn dựa trên mối quan tâm về mặt lý thuyết, thì ba lô sẽ thú vị hơn, bởi vì nó cho phép chúng ta hiểu sâu hơn - nó cho phép chúng ta phân biệt giữa kích thước và cường độ - trong khi đó, ba lô đơn phương ngăn chúng ta tạo ra sự khác biệt đó.


Để trả lời câu hỏi tiếp theo về thuật toán lập trình động cho bài toán về chiếc ba lô:

Có, thuật toán lập trình động tương tự có thể được áp dụng cho cả ba lô và cho ba lô đơn nguyên. Thời gian chạy của nó là đa thức theo độ lớn của các số, nhưng theo cấp số nhân (không phải đa thức) theo độ dài của các số khi được mã hóa thành nhị phân. Do đó, thời gian chạy của nó đa thức về độ dài của đầu vào khi đầu vào được mã hóa thành đơn vị nhưng không phải là đa thức về độ dài của đầu vào khi đầu vào được mã hóa ở dạng nhị phân. Đó là lý do tại sao chúng tôi làm xét thuật toán lập trình năng động này là một thuật toán thời gian đa thức cho ba lô unary, nhưng không coi nó là một thuật toán thời gian đa thức cho ba lô (nhị phân được mã hóa).

Hãy nhớ lại rằng chúng ta nói một thuật toán chạy trong thời gian đa thức nếu thời gian chạy của nó nhiều nhất là một số đa thức về độ dài của đầu vào, tính bằng bit .


1
Cảm ơn bạn rất nhiều, tôi đã không biết rằng lớp phức tạp của unary và non-unary của cùng một thuật toán có thể khác nhau. Tại sao giải pháp lập trình động của ba lô tiêu chuẩn không thể được áp dụng cho ba lô đơn phương và nó dẫn đến lớp phức tạp khác nhau? Tôi đang gặp vấn đề với việc hiểu phiên bản đơn nhất của các vấn đề.
M ama D

@Drupalist, tôi đã chỉnh sửa câu trả lời của mình để thêm hai đoạn văn ở cuối để trả lời câu hỏi đó.
DW

Cảm ơn bạn rất nhiều, từ những gì tôi hiểu được sự khác biệt giữa kích thước đầu vào và độ lớn của nó là lý do phân biệt giữa đa thức và giả đa thức, bằng cách sử dụng biểu diễn đơn nhất tôi đã cố gắng loại bỏ sự khác biệt này, Nếu chúng ta quên mất ba lô và trở lại số Các thuật toán, tôi muốn biết bằng cách đặt điều gì sẽ là sự giải thích của đa thức và giả đa thức? Cảm ơn một lần nữax= =n
M ama D

@Drupalist, tôi không hoàn toàn chắc chắn ý của bạn là gì khi đặt , vì vậy tôi không biết phải trả lời như thế nào. Tại thời điểm này tôi sẽ đề nghị tốt nhất là hỏi một câu hỏi mới (khép kín) (và xác định tất cả các biến của bạn trong câu hỏi đó). Nền tảng này không tốt cho các câu hỏi tiếp theo hoặc qua lại: cách tốt nhất chúng ta phải xử lý là hỏi một câu hỏi mới, dựa trên những gì bạn đã học được từ câu trả lời cho câu hỏi này. x= =n
DW

1
@NikosM., OK, hiểu rồi. Cảm ơn vì bạn đã phản hồi. Cá nhân, tôi không tin rằng tuyên bố đó là không chính xác, vì vậy tôi sẽ để nó như vậy. (Lý luận của tôi: Độ dài của đầu vào phụ thuộc vào sự lựa chọn đại diện, vì vậy tôi không tin rằng nó mâu thuẫn với bất cứ điều gì bạn đã viết.) Tuy nhiên, hoàn toàn có thể quan điểm của tôi có thể quá hẹp hoặc giải thích hoặc giải thích chi tiết hơn từ một quan điểm khác nhau có thể thêm giá trị. Vui lòng viết câu trả lời bổ sung hoặc đề nghị chỉnh sửa nếu bạn cảm thấy điểm này có thể rõ ràng hơn.
DW

6

Tôi sẽ thêm một điều nhỏ vào câu trả lời của DW:

Tôi đã thấy những người nghĩ rằng vì Knapsack đơn nguyên nằm trong P do đó chúng ta có thể sử dụng nó thay cho Knapsack, thuật toán tốt nhất hiện tại có thời gian theo cấp số nhân.

Hãy để cho đầu vào được k và xem xét các thuật toán lập trình động cho Knapsack và unary Knapsack. Thời gian chạy cho cả hai là O ( n k ) . Đó là cùng một thời gian chạy. Tức là nếu bạn có đầu vào thì sẽ không có vấn đề gì nếu bạn sử dụng lập trình động cho Knapsack đơn hoặc lập trình động cho Knapsack. Cả hai sẽ mất (khoảng) cùng một lượng thời gian để giải quyết trường hợp vấn đề. Về mặt lý thuyết, bất cứ nơi nào bạn sử dụng cái này bạn cũng có thể sử dụng cái kia. Bạn chỉ cần chuyển đổi số từ unary sang nhị phân và ngược lại.W={w1,,wn}kO(nk)

O(nk)

Nếu bạn quan tâm đến một vấn đề trong sự cô lập, bạn có thể làm như vậy. Trên thực tế đó là những gì mọi người trong thuật toán thường làm. Độ phức tạp của thuật toán đồ thị thường được thể hiện dưới dạng các đỉnh số và số cạnh, không phải kích thước của chuỗi mã hóa chúng.

Nhưng đây chỉ là khi chúng ta đang đối phó với một vấn đề bị cô lập. Nó không hữu ích khi chúng ta đang xử lý các vấn đề với các loại đầu vào khác nhau. Đối với đồ thị, chúng ta có thể nói về thời gian chạy wrt đến số đỉnh và cạnh. Đối với Knapsack chúng ta có thể nói về số lượng vật phẩm và kích thước của Knapsack. Nhưng nếu chúng ta muốn nói về cả hai thì sao? Ví dụ: khi chúng tôi muốn giảm bớt giữa các vấn đề hoặc thảo luận về loại vấn đề bao gồm các vấn đề tùy ý, không chỉ các vấn đề có biểu đồ làm đầu vào. Chúng ta cần một tham số phổ quát của đầu vào. Một đầu vào nói chung chỉ là một chuỗi, chính chúng ta diễn giải các ký hiệu của nó là số đơn, số nhị phân, đồ thị, v.v. Để phát triển một lý thuyết chung về độ phức tạp của thuật toán và các vấn đề chúng ta cần một tham số chung của đầu vào. Kích thước của đầu vào là một lựa chọn rõ ràng và hóa ra nó đủ mạnh để chúng ta có thể xây dựng một lý thuyết hợp lý trên đầu trang. Nó không phải là khả năng duy nhất. Đối với một nhân tạo, chúng ta có thể xây dựng một lý thuyết dựa trên2

k100100k21001kk21001

nnp(n)kp(n)k2p(n)1kk

nk


Cảm ơn bạn rất nhiều, một câu hỏi nữa, bằng cách chuyển đổi đầu vào thành đại diện đơn nhất của nó, điều gì sẽ xảy ra với vấn đề xác định xem một số có phải là số nguyên tố hay không? Vấn đề này là đa thức dựa trên cường độ đầu vào nhưng theo cấp số nhân dựa trên các bit đầu vào (như tôi đã chỉ ra trong câu hỏi), liệu sự hội tụ này có làm gì tốt hơn không?
M ama D

nO(n)nb=210241210241210241
Kaveh

làm rõ, tuy nhiên hãy xem nhận xét của tôi dưới câu trả lời của DW có liên quan đến bài đăng này
Nikos M.

2

Tóm lại và đơn giản, tôi sẽ cho bạn thấy lý do tại sao.

Tally

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

xxO(2n)

Tally/UnaryO(n)x

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

Các đại diện đầu vào không làm cho mã chạy nhanh hơn. Mặc dù thuật toán thứ 2 thực sự là đa thời gian. Nó không thực tế lắm trong việc tìm kiếm các yếu tố cho RSA.


Ví dụ hay, cảm ơn
M ama D
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.