จำนวนเอาต์พุตที่ไม่ซ้ำกันโดยการแทนที่ตัวแปร


9

รับชุดของสูตรดังนี้:

bacb
bcab
cbba
abbc

ให้อัลกอริทึมที่ค้นหาจำนวนผลลัพธ์ที่ไม่ซ้ำกันซึ่งคุณสามารถรับได้เมื่อแต่ละตัวแปรถูกแทนที่ด้วย "0" หรือ "1" ในทุกสูตร

มี(k!)^2สูตรแต่ละสูตรมี2k-1ตัวแปรและk^2เงื่อนไข แสดงความ asymptotics kคุณในแง่ของ

อัลกอริทึมที่เร็วที่สุดชนะ ในกรณีที่วิธีการแก้ปัญหาที่มีการใช้หน่วยความจำ asymptotic ที่ต่ำกว่าชนะ หากยังคงเสมอกันโพสต์แรกจะชนะ


สำหรับตัวอย่างด้านบนผลลัพธ์ต่อไปนี้สามารถรับได้โดยการแทนที่ตัวแปร:

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

ดังนั้นคำตอบที่ถูกต้องคือ 12 หมู่คนอื่น ๆ1010ไม่สามารถทำได้โดยใช้สูตรข้างต้น

ผมได้ทำอีกสามกรณีการทดสอบกับการแก้ปัญหาที่เกี่ยวข้องของ230 , 12076และ1446672


ชี้แจง: k คืออะไรในคำถาม? มันเป็นค่าคงที่นามธรรมหรือไม่?
isaacg

@isaacg ใช่ เพื่อป้องกันความสัมพันธ์ระหว่างโซลูชันที่เร็วขึ้นสำหรับสูตรน้อยลง แต่ใหญ่ขึ้น
orlp

ดังนั้นตัวอักษรแต่ละตัวa, b... เป็นตัวแปร ? และเรามีตัวแปรไม่เท่ากันเสมอ? ไม่สำคัญว่าลำดับของตัวแปรจะนานแค่ไหนและคุณได้รับสูตรกี่สูตร ?
ข้อบกพร่อง

@flawr ความสัมพันธ์ที่แน่นอนระหว่างจำนวนของตัวแปรจำนวนคำและจำนวนสูตรจะได้รับในคำถาม
orlp

ไม่ 'สามารถ' หมายความว่าคุณจะได้รับถึง $ (k) ^ 2 $ สูตรหรือมีตรง $ (k) ^ 2 $ สูตร? นอกจากนั้นคุณมีแอปพลิเคชันสำหรับอัลกอริทึมที่มีข้อกำหนดเหล่านั้นหรือไม่? ฉันแค่ถามเพราะสเปคดูเหมือนจะค่อนข้างไร้เหตุผล
ข้อบกพร่อง

คำตอบ:


2

เวลา Mathematica, O (k ^ 2 (k!) ^ 2)

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

หวังว่าฉันจะคำนวณความซับซ้อนของเวลาได้อย่างถูกต้อง {"bacb","bcab","cbba","abbc"}ป้อนข้อมูลคือรายการของสูตรเช่น ทำงานในเวลาน้อยกว่า 30 วินาทีสำหรับทุกกรณีการทดสอบในเครื่องของฉัน แต่ใครจะสนใจเวลาที่แน่นอน

คำอธิบาย:

  • ก่อนอื่น&ตอนท้ายทำให้ฟังก์ชันบริสุทธิ์โดย#อ้างถึงอาร์กิวเมนต์แรกเป็นอาร์กิวเมนต์#2ที่สองเป็นต้น
  • Length[*..*] ใช้ความยาวของรายการที่อยู่ข้างใน
  • Union@@(*..*)รับรายการที่มีอยู่แล้วส่งเป็นอาร์กิวเมนต์Unionซึ่งส่งคืนรายการองค์ประกอบที่ไม่ซ้ำกันในอาร์กิวเมนต์ใด ๆ
  • *..*&/@#ใช้ฟังก์ชั่นที่บริสุทธิ์และแผนที่มันมากกว่ารายการของสูตรเพื่อให้กลายเป็น{a,b,c} {f[a],f[b],f[c]}โปรดทราบว่าในฟังก์ชั่นบริสุทธิ์ที่ซ้อนกัน#nหมายถึงข้อโต้แย้งด้านในสุด
  • Fold[*..*&,#,*..*]f[f[...[f[starting value,l_1],l_2],...],l_n]ใช้ฟังก์ชั่นสะสมค่าเริ่มต้นและรายชื่อและผลตอบแทน
  • Union[Characters[#]] รับตัวละครทั้งหมดในสูตรปัจจุบันและรับองค์ประกอบที่ไม่ซ้ำกันทั้งหมดทำให้เรามีตัวแปร
  • Flatten[*..*]flattens โต้แย้งเพื่อให้กลายเป็น{{{a},b},{{c,{d}}}}{a,b,c,d}
  • {*..*,*..*}Flattenเป็นเพียงวิธีการที่จะรวมทั้งสองผลการใช้ดังกล่าวข้างต้น
  • StringReplace[#,#2->"0/1"]ใช้เวลาผลก่อนและผลตอบแทนกับตัวแปรในปัจจุบันแทนที่ด้วยทั้งหรือ01

ทำไมคุณถึงใช้kเป็นตัวแปรในเวลาของคุณ? ถึงเวลาแล้ว วุ้ย
theonlygusti

op กล่าวว่า: "แสดง asymptotics ของคุณในแง่ของk" นอกจากนี้ฉันต้องทำGeneralUtilities`Benchmarkสำหรับแต่ละวิธีที่ใช้
LegionMammal978

สนใจที่จะเพิ่มคำอธิบายอัลกอริธึมภาษาอังกฤษแบบธรรมดาหรือไม่? ฉันไม่คุ้นเคยกับ Mathematica ดังนั้นฉันจึงไม่สามารถยืนยันโซลูชันของคุณได้
orlp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.