Điểm:2

Độ phức tạp về thời gian của thuật toán tìm kiếm toàn diện

lá cờ in

Tôi có các bộ $S_1=\{2,10,20,6\}$$S_2=\{25,26,20\}$ và tôi muốn tìm những số có tổng bằng 32. Điều này rất dễ dàng bằng cách kiểm tra; 6 và 26. Nó có vẻ tương tự như vấn đề Ba lô, nhưng tôi không phải là chuyên gia.

Tuy nhiên, giả sử tôi có 1000 bộ, mỗi bộ có 500 phần tử sao cho tổng một số hạng từ mỗi bộ luôn mang lại cho bạn một giá trị duy nhất. Điều này khó kiểm tra và giải quyết hơn nhiều, đặc biệt nếu các tập hợp tuân theo một cấu trúc có vẻ ngẫu nhiên (chúng sẽ được xây dựng từ các tập hợp có cấu trúc đã bị xáo trộn và gần như không thể đoán được sự trộn lẫn và đảo ngược các tập hợp).

Vì vậy, cách duy nhất phải là Thuật toán tìm kiếm toàn diện. Với số của tôi là 52.485.332, có $1000^{500}$ tùy chọn có thể để xem xét. Thật vậy, sẽ có nhiều cách để rút ngắn tìm kiếm này (chẳng hạn như khi một tập hợp có các số lớn hơn giá trị mục tiêu của bạn, bạn có thể bỏ qua các số đó). Nhưng nếu không thì bạn có thể vẫn đang xem $750^{500}$ lựa chọn có thể.

Vì vậy, độ phức tạp thời gian của một thuật toán tìm kiếm như vậy là gì? $O(n^{k})$, với $n$ số lượng bộ và $k$ số phần tử của các tập hợp đó? Họ phải kiểm tra "tất cả" các kết hợp cụm từ có thể có cho đến khi một cụm từ khớp với giá trị đã cho.

Các câu hỏi chính dường như là "có bao nhiêu bộ?" và "bộ lớn như thế nào?". Thật vậy, các bộ cũng có thể có nhiều kích cỡ khác nhau, không chỉ đồng nhất.

Tôi không phải là người thích mật mã; nghiên cứu của tôi chỉ tán tỉnh với ý tưởng trong tầm tay. Bất kỳ trợ giúp sẽ được đánh giá cao.

poncho avatar
lá cờ my
"Vì vậy, cách duy nhất phải là Thuật toán tìm kiếm toàn diện" - ừm, không, ngay cả khi không có bất kỳ cấu trúc nào trong các giá trị, vẫn có các phương pháp tìm kiếm hiệu quả hơn đáng kể; một điều xuất hiện ngay trong đầu mất $O(nm)$ thời gian (trong đó $m$ là tổng mục tiêu; với $m=52485332$, có vẻ như có thể giải được trên thực tế). Bạn có quan tâm hay truy vấn của bạn đặc biệt về thời gian thực hiện bởi thuật toán tìm kiếm ngây thơ?
MeBadMaths avatar
lá cờ in
@poncho cảm ơn vì nhận xét. Tôi không biết rằng có những phương pháp tốt hơn phương pháp tìm kiếm "ngây thơ". Tôi sẽ quan tâm đến cái bạn đề xuất - bất cứ điều gì bạn có thể đề xuất đều tuyệt vời.
jjj avatar
lá cờ cn
jjj
Có 500^1000 tùy chọn, không phải 1000^500
Điểm:2
lá cờ my

Vì vậy, cách duy nhất phải là Thuật toán tìm kiếm toàn diện

Như tôi đã đề cập trong nhận xét của mình, có những phương pháp thực tế cho các giá trị không quá lớn của $m$ (và $m=52485332$ không lớn). Đây là phác thảo của một phương pháp như vậy (giả sử tất cả các tập hợp bao gồm các số nguyên không âm):

  • Chúng tôi có một mảng $A_{n, m+1}$; từng phần tử của mảng $A_{a, b}$ sẽ lưu ý cách chúng ta có thể tạo tổng $b$ từ đầu tiên $a$ bộ (hoặc $\perp$ nếu chưa có cách nào như vậy được tìm thấy).

  • Khởi tạo tất cả các phần tử $A$ đến $\perp$

  • $i := 1$ đến $n$ tìm kiếm các yếu tố $A_{i-1}$ cho không$\perp$ phần tử (và cho $i=1$, phần tử thứ 0 được coi là phần tử duy nhất không phải$\perp$ thành phần. Đối với mỗi phần tử như vậy $A_{i-1, x}$, bộ $A_{i, x + S_{i,j}}$ đến $j$ (đối với mỗi phần tử $S_{i,j}$ của bộ $S_i$) Nếu $x + S_{i,j} > m$, đừng để ý đến nó.

  • Cuối cùng, nếu $A_{n,m} = \perp$, không có tập con nào dẫn đến tổng $m$. Nếu đó là bất kỳ điều gì khác, chúng tôi có thể khôi phục các thuật ngữ bằng cách quay lui qua mảng $A$.

Đây phải là một thuật toán thực tế để khôi phục các thuật ngữ cho các tham số bạn đã chỉ định.

jjj avatar
lá cờ cn
jjj
Trong câu hỏi đã nói rằng tổng luôn mang lại một giá trị duy nhất. Điều này có nghĩa là có 1000^500 kết quả khác nhau, vì vậy chúng tôi phải cho rằng chúng tôi cũng đang nói về m ở mức độ này. Thuật toán này sẽ "không bao giờ" kết thúc sau đó
poncho avatar
lá cờ my
@jjj: câu hỏi cũng nêu rõ "Với số của tôi là 52.485.332"; Tôi đã cho rằng họ đang niêm yết giá trị $m$ của mình; nếu không, "số của tôi" là gì?
jjj avatar
lá cờ cn
jjj
Tôi đoán tác giả của câu hỏi không nhận thức được thực tế rằng tính duy nhất sẽ dẫn đến hầu hết các số của tập hợp sẽ lớn hơn nhiều so với tổng của nó. Và loại bỏ chúng sẽ làm giảm đáng kể vấn đề
MeBadMaths avatar
lá cờ in
Cảm ơn cả hai câu trả lời và nhận xét của bạn. Tôi không thành thạo các chi tiết về Mật mã nên xin lỗi vì sự nhầm lẫn mà bài đăng của tôi đã gây ra. Việc tôi nghĩ 52.485.332 là "khủng" cho thấy sự thiếu hiểu biết của tôi haha. Làm rõ; tất cả các tập hợp là số nguyên không âm. Lấy một giá trị từ mỗi bộ và tính tổng chúng sẽ luôn đảm bảo một phần tử duy nhất.
MeBadMaths avatar
lá cờ in
Theo "số của tôi", ý tôi là thuật ngữ tôi đã mã hóa (điều mà tôi không nói rõ - xin lỗi!). Giả sử tôi có một tin nhắn và mã hóa nó thông qua các bộ này. Con số kết quả là 52.485.332 (hoặc thậm chí có thể lớn hơn!). Công việc của Thuật toán tìm kiếm là tìm những giá trị duy nhất trong 1000 tập hợp có tổng để tạo thành con số này. Từ đó bạn có thể giải mã tin nhắn. 1000 bộ hoạt động như một khóa công khai. Vì vậy, nếu nó dễ bị bẻ khóa thì đó là một vấn đề. Hy vọng rằng sẽ giúp. @jjj bạn có thể giải thích thêm về nhận xét cuối cùng của mình không? Tôi không nghĩ rằng tôi làm theo, xin lỗi
MeBadMaths avatar
lá cờ in
@poncho Cảm ơn thuật toán. Tôi không nghĩ rằng tôi hiểu T lộn ngược là viết tắt của từ gì - kiến ​​thức về ký hiệu của tôi về Mật mã học là cơ bản nhất. Tôi sẽ xem xét kỹ hơn và xem liệu tôi có thể hiểu phần còn lại của nó không
poncho avatar
lá cờ my
@MeBadMaths: $\perp$ có nghĩa là "trống", nghĩa là một biểu tượng có thể phân biệt được với bất kỳ giá trị hợp lệ nào. Theo thuật ngữ C, hãy nghĩ về nó như một con trỏ NULL ...
MeBadMaths avatar
lá cờ in
@poncho: cảm ơn bạn đã làm rõ. Tôi cảm thấy như thuật toán đó tương tự như Thuật toán tìm kiếm Naëve theo nghĩa là bạn đang lặp qua tất cả các tập hợp và biên soạn một danh sách các giá trị có thể có cho đến nay có thể được tính tổng. Nếu bất kỳ khoản tiền nào trở nên quá lớn, bạn sẽ ngừng xem xét nó. Cuối cùng, bạn sẽ ngừng tập trung vào tất cả trừ những giá trị bằng hoặc nhỏ hơn giá trị được chỉ định. Tôi cho rằng một lợi thế của thuật toán của bạn là bạn không kiểm tra các giá trị cho đến khi kết thúc - ngoại trừ việc so sánh nếu nó quá lớn?
MeBadMaths avatar
lá cờ in
Một câu hỏi tôi có là; bạn cần bao nhiêu bộ (có kích thước khác nhau) để thuật toán này mất quá nhiều thời gian? Như @jjj đã đề xuất, mặc dù bạn có thể ngừng xem xét một phần hợp lý của các tập hợp vì cuối cùng rất nhiều giá trị của các số sẽ quá lớn. Ví dụ: nếu các số được mã hóa của bạn nằm ở giữa tất cả các số tổng có thể có, thì bước đầu tiên có thể chỉ xem xét 250 số, nhưng sau đó mỗi số đó cộng 250 từ tập hợp thứ hai, rồi 250 trên mỗi số đó cho bộ thứ ba. Điều này có vẻ như nó sẽ sớm trở nên LỚN? Mặc dù, một lần nữa, tôi có thể đánh giá thấp "khổng lồ" haha
poncho avatar
lá cờ my
@MeBadMaths: trên thực tế, lợi thế thực sự của thuật toán của tôi (so với tìm kiếm vũ phu) là nếu có nhiều cách để đạt được tổng trung gian. Giả sử có 1000 cách khác nhau để đạt được giá trị 314159 sau 42 bước; brute force sẽ lặp lại phép tính bắt đầu từ (314159,42) 1000 lần; thuật toán của tôi sẽ làm điều đó chỉ một lần.
poncho avatar
lá cờ my
@MeBadMaths: đối với các cách làm cho vấn đề không khả thi đối với thuật toán của tôi, cách rõ ràng nhất là làm cho m trở nên lớn.Đối với m không giới hạn, vấn đề này thực sự là NP-khó, tuy nhiên để đi vào phạm vi thực sự khó, m phải rất lớn ...
MeBadMaths avatar
lá cờ in
@poncho Tôi tin rằng sẽ chỉ có 1 cách sau 42 bước đầu tiên để đạt được 314159. Nếu có nhiều cách hơn thì sẽ không có sự kết hợp duy nhất cho mỗi tổng. Nhưng tôi có thể thấy cách thuật toán của bạn thực hiện những gì bạn nêu- đó là một thuật toán thực sự tuyệt vời và được cân nhắc kỹ lưỡng! Tốt hơn nhiều so với bất cứ điều gì tôi có thể làm haha. Cảm ơn bạn đã làm rõ về $m$. Tôi thực sự đánh giá thấp "khổng lồ" có nghĩa là gì.
Điểm:1
lá cờ cn
jjj

Đây là một câu trả lời nhiều hơn cho lý do tại sao tính duy nhất của các khoản tiền lại ảnh hưởng đến quy mô đến mức trường hợp $52485332$ trở nên tầm thường (theo cách của nó để mong đợi một bình luận).

Khi tất cả các tổng phải là duy nhất, thì chúng phải dẫn đến các số nguyên khác nhau. Bởi vì có $500^{1000}$ số tiền có thể, cũng có $500^{1000}$ kết quả số nguyên khác nhau cho điều đó. trường hợp thấp nhất sẽ là tất cả các số nguyên từ $0$ đến $500^{1000}-1$.

Ví dụ,

$S_1 = \{0, 1, 2, ..., 499\}$

$S_2 = \{0, 500, 1000, ..., 249500\}$

$S_3 = \{0, 250000, 500000, ..., 124750000\}$

...

$S_{1000} = \{0, 500^{999}, 2*500^{999}, ..., 499*500^{999}\}$

sẽ là một cách để đảm bảo tính duy nhất của kết quả. Như bạn có thể thấy, Các con số trở nên lớn rất nhanh.

Trong ví dụ cụ thể này, thật dễ dàng để tìm thấy kết quả (chỉ cần luôn chọn số lớn nhất phù hợp từ tập hợp cuối cùng đến tập hợp đầu tiên). Thậm chí hầu hết các số là $S_3$ lớn hơn $52485332$ và do đó có thể bỏ qua.

Bạn có thể muốn các giá trị tương đối ngẫu nhiên trong tập hợp của mình. Trong trường hợp này, phạm vi của các giá trị ít nhất phải lớn hơn một chút.

Tuy nhiên, rất khó có khả năng bất kỳ giá trị nào thấp hơn hoặc bằng $52485332$ (khi bạn thống nhất chọn $500000$ các giá trị trong số $500^{1000}$)

Lập trình động, như @poncho đã đề xuất, thực sự chỉ hoạt động với các số nhỏ và hiệu suất của nó không tốt hơn nhiều so với tìm kiếm toàn diện (sự khác biệt tuyến tính về số lượng tập hợp), bởi vì các tổng phụ, có thể được sử dụng lại là duy nhất, lợi thế của việc không nhìn vào những khả năng khác là không có. Thời gian chạy phải theo thứ tự như tìm kiếm toàn diện. Chỉ có sự cải thiện là lên tàu khi các giá trị lớn hay nhỏ để đạt được mục tiêu, nhưng đối với các mục tiêu hợp lý thì không có nhiều lợi thế.

Bật có thể dễ dàng giảm bài toán tính tổng tập hợp con hoặc bài toán chiếc ba lô xuống bài toán này bằng cách chỉ sử dụng cùng một tập hợp nhiều lần số bạn muốn tính tổng.Vấn đề với điều này là đây không phải là một con kiến ​​​​giảm thời gian đa thức, do đó không đủ để chứng minh nếu vấn đề là NP khó.

MeBadMaths avatar
lá cờ in
Cảm ơn bạn đã phản hồi. Ví dụ về các tập hợp bạn đưa ra là ví dụ mà tôi biết rõ và là ví dụ cơ bản nhất trong số các tập hợp này. Tuy nhiên, từ đó bạn có thể "lộn xộn" thiết lập này theo cách hoàn toàn không thể khôi phục được nếu không có thông tin bổ sung (khóa riêng tư). Các tập hợp "lộn xộn" kết quả sẽ có vẻ ngẫu nhiên và sẽ tạo ra một loạt các tập hợp rất lớn. Tôi đồng ý rằng 52485332 đã cho là quá nhỏ - tôi thực sự không nghĩ đến điều đó haha. Tuy nhiên, giả sử giá trị của tôi có kích thước đủ lớn được theo dõi chính xác với các tập hợp "ngẫu nhiên" - tôi cho rằng điều đó khiến vấn đề này khó giải quyết hơn?
jjj avatar
lá cờ cn
jjj
@MeBadMaths Số cách để giải quyết vấn đề này tương đối hạn chế (nếu có thể). Ví dụ: khi bạn chia {0, 1, 2, 3, 0, 4, 8, 12} (ví dụ nhỏ hơn cùng cấu trúc) thành hai bộ có kích thước 4, thì chỉ có một cách để thực hiện việc này (bỏ qua thứ tự của các bộ và thứ tự bên trong bộ)
MeBadMaths avatar
lá cờ in
Có thể làm "lộn xộn" các thiết lập này, nhưng nó sẽ ngày càng lớn hơn khi bạn nhận được các giá trị ngày càng lớn hơn. Đặt $N=\prod_{j=1}^n |S_{j}|$, sau đó lấy $d>N$. Lấy $r$ sao cho $r$ và $d$ là nguyên tố cùng nhau và lấy $0\leq t_1,t_2,\dots,t_n
jjj avatar
lá cờ cn
jjj
@MeBadMaths Ok, đúng rồi. Tôi nghĩ bạn chỉ muốn hoán đổi các phần tử chứ không sửa đổi chúng. Tôi đã xác minh rằng công thức của bạn đúng và thực sự không thể phân biệt được với các giá trị ngẫu nhiên. Tôi sẽ điều chỉnh phần cuối cùng của câu trả lời của tôi
MeBadMaths avatar
lá cờ in
cảm ơn tất cả các ý kiến ​​​​và câu trả lời của bạn - và xin lỗi vì lời giải thích kém của tôi. Tôi chưa từng sử dụng các diễn đàn này trước đây ở mức độ như vậy nên tôi vẫn chưa quen với cách định dạng câu hỏi, v.v. Tôi thực sự đánh giá cao sự hỗ trợ của bạn. Chắc chắn không tìm cách chứng minh NP haha. Đầu vào của bạn đã giúp tuy nhiên. Câu hỏi cuối cùng sẽ là; thứ tự tìm kiếm mở rộng $O(n^k)$ như tôi đã giả định trong bài đăng của mình hay $O(k^n)$? Hay nó là cái gì khác? Cám ơn bạn một lần nữa
jjj avatar
lá cờ cn
jjj
Tôi muốn nói rằng nó không đủ để chứng minh rằng vấn đề này là NP khó ^^. Tìm kiếm toàn diện sẽ là O(k^n) (mọi k phần tử trong tập hợp một có thể được kết hợp với mọi phần tử trong số k phần tử trong tập hợp 2 ...)
MeBadMaths avatar
lá cờ in
Vâng, điều đó có ý nghĩa, hơn cả $n^k$. Tôi đã đọc trang wiki về Độ phức tạp của Thời gian và tôi không thể biết liệu $O(k^n)$ là Thời gian Đa thức hay Thời gian Hàm mũ? (hoặc không!) Tôi thề đây là câu hỏi cuối cùng ahaha, cảm ơn vì sự giúp đỡ của bạn @jjj

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.