Số lượng đầu ra duy nhất bằng cách thay thế các biến


9

Cho một tập hợp các công thức như thế này:

bacb
bcab
cbba
abbc

Đưa ra thuật toán tìm số kết quả duy nhất bạn có thể nhận được khi mỗi biến được thay thế bằng "0" hoặc "1" trong mỗi công thức.

(k!)^2các công thức, mỗi công thức có 2k-1các biến và k^2thuật ngữ. Thể hiện sự không triệu chứng của bạn về k.

Thuật toán nhanh nhất chiến thắng. Trong trường hợp hòa, giải pháp sử dụng bộ nhớ tiệm cận thấp hơn sẽ thắng. Nếu đó vẫn là hòa, bài đầu tiên sẽ thắng.


Đối với ví dụ trên, có thể thu được các kết quả sau bằng cách thay thế các biến:

1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111

Vì vậy, câu trả lời đúng là 12. Trong số những người khác, 1010không thể được thực hiện bằng cách sử dụng các công thức trên.

Tôi đã thực hiện thêm ba trường hợp thử nghiệm, với các giải pháp tương ứng là 230 , 120761446672 .


Làm rõ: k trong câu hỏi là gì? Có phải nó chỉ là một hằng số trừu tượng?
isaacg

@isaacg Vâng. Chẳng hạn, để ngăn chặn mối quan hệ giữa các giải pháp nhanh hơn đối với các công thức ít hơn nhưng lớn hơn.
orlp

Vì vậy, mỗi chữ cái a, b... là một biến ? Và chúng ta luôn luôn chỉ có một số lượng biến không đồng đều? Không quan trọng trình tự các biến là bao lâu và trên bao nhiêu công thức bạn được đưa ra?
flawr

@flawr Mối quan hệ chính xác giữa số lượng biến, số thuật ngữ và số lượng công thức được đưa ra trong câu hỏi.
orlp

Liệu 'có thể' có nghĩa là bạn có thể nhận được tới $ (k!) ^ 2 $ công thức hoặc có chính xác công thức $ (k!) ^ 2 $ không? Bên cạnh đó, bạn có ứng dụng nào cho một thuật toán với các thông số kỹ thuật đó không? Tôi chỉ hỏi vì thông số kỹ thuật có vẻ khá độc đoán.
flawr

Câu trả lời:


2

Toán học, thời gian O (k ^ 2 (k!) ^ 2)

Length[Union@@(Fold[Flatten[{StringReplace[#,#2->"0"],StringReplace[#,#2->"1"]}]&,#,Union[Characters[#]]]&/@#)]&

Hy vọng tôi đã tính toán độ phức tạp thời gian một cách chính xác. Đầu vào là một danh sách các công thức như {"bacb","bcab","cbba","abbc"}. Chạy trong chưa đầy 30 giây cho mọi trường hợp thử nghiệm trên máy của tôi, nhưng ai quan tâm đến thời gian tuyệt đối?

Giải trình:

  • Trước hết, &ở cuối làm cho nó trở thành một hàm thuần túy, với #tham chiếu đến đối số thứ nhất, #2là đối số thứ hai, v.v.
  • Length[*..*] mất độ dài của danh sách chứa bên trong nó.
  • Union@@(*..*)lấy danh sách chứa và cung cấp nó làm đối số cho Union, nó trả về một danh sách các phần tử duy nhất trong bất kỳ đối số nào của nó.
  • *..*&/@#nhận một hàm thuần túy và ánh xạ nó qua danh sách các công thức, để nó {a,b,c}trở thành {f[a],f[b],f[c]}. Lưu ý rằng trong các hàm thuần túy lồng nhau, #nđề cập đến các đối số trong cùng của nó.
  • Fold[*..*&,#,*..*]có chức năng tích lũy, giá trị bắt đầu và danh sách và trả về f[f[...[f[starting value,l_1],l_2],...],l_n].
  • Union[Characters[#]] lấy tất cả các ký tự trong công thức hiện tại và nhận tất cả các phần tử duy nhất, cung cấp cho chúng ta các biến.
  • Flatten[*..*]làm phẳng lập luận của nó, để {{{a},b},{{c,{d}}}}trở thành {a,b,c,d}.
  • {*..*,*..*}chỉ đơn giản là một cách để kết hợp hai kết quả bằng cách sử dụng ở trên Flatten.
  • StringReplace[#,#2->"0/1"]lấy kết quả trước đó và trả về nó với biến hiện tại được thay thế bằng 0hoặc 1.

Tại sao bạn sử dụng knhư là biến trong thời gian của bạn? Tuy nhiên, thời gian giai thừa! Phù!
theonlygusti

Các op nói: "Thể hiện sự không triệu chứng của bạn về mặt k." Ngoài ra, tôi đã phải làm một GeneralUtilities`Benchmarkcho mỗi phương pháp được sử dụng.
LegionMammal978

Quan tâm để thêm một mô tả tiếng Anh đơn giản của thuật toán của bạn? Tôi không quen thuộc với Mathicala, vì vậy tôi không thể xác minh giải pháp của bạn.
orlp
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.