คำถามติดแท็ก combinatorics

30
วิธีสร้างพีชคณิตทั้งหมดของรายการ?
คุณจะสร้างพีชคณิตทั้งหมดของรายการใน Python โดยไม่ขึ้นกับประเภทขององค์ประกอบในรายการได้อย่างไร ตัวอย่างเช่น: permutations([]) [] permutations([1]) [1] permutations([1, 2]) [1, 2] [2, 1] permutations([1, 2, 3]) [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]

12
การเปลี่ยนแปลงอย่างรวดเร็ว -> จำนวน -> อัลกอริทึมการจับคู่การเปลี่ยนแปลง
ฉันมี n องค์ประกอบ ยกตัวอย่างเช่น 7 องค์ประกอบ 1234567 ฉันรู้ว่ามี 7! = 5040 การเรียงสับเปลี่ยนที่เป็นไปได้ของ 7 องค์ประกอบเหล่านี้ ฉันต้องการอัลกอริทึมที่รวดเร็วซึ่งประกอบด้วยสองฟังก์ชัน: f (ตัวเลข) จับคู่ตัวเลขระหว่าง 0 ถึง 5039 กับการเรียงสับเปลี่ยนที่ไม่ซ้ำกันและ f '(การเรียงสับเปลี่ยน) แมปการเปลี่ยนแปลงกลับไปยังหมายเลขที่สร้างขึ้น ฉันไม่สนใจเกี่ยวกับความสอดคล้องระหว่างตัวเลขและการเรียงสับเปลี่ยนการให้การเรียงสับเปลี่ยนแต่ละครั้งมีหมายเลขเฉพาะของตัวเอง ตัวอย่างเช่นฉันอาจมีฟังก์ชันที่ f(0) = '1234567' f'('1234567') = 0 อัลกอริทึมที่เร็วที่สุดที่นึกถึงคือการแจกแจงการเรียงสับเปลี่ยนทั้งหมดและสร้างตารางการค้นหาในทั้งสองทิศทางดังนั้นเมื่อสร้างตารางแล้ว f (0) จะเป็น O (1) และ f ('1234567') จะเป็น a ค้นหาสตริง อย่างไรก็ตามนี่คือความจำหิวโดยเฉพาะอย่างยิ่งเมื่อ n มีขนาดใหญ่ ใครสามารถเสนออัลกอริทึมอื่นที่จะทำงานได้อย่างรวดเร็วและไม่มีข้อเสียของหน่วยความจำ?

5
สร้างการเรียงสับเปลี่ยนอย่างเฉื่อยชา
ฉันกำลังมองหาอัลกอริทึมเพื่อสร้างการเรียงสับเปลี่ยนของชุดในลักษณะที่ฉันสามารถสร้างรายการขี้เกียจใน Clojure ได้ เช่นฉันต้องการวนซ้ำรายการของการเรียงสับเปลี่ยนโดยที่การเรียงสับเปลี่ยนแต่ละรายการจะไม่ถูกคำนวณจนกว่าฉันจะร้องขอและการเรียงสับเปลี่ยนทั้งหมดไม่จำเป็นต้องเก็บไว้ในหน่วยความจำในครั้งเดียว หรือฉันกำลังมองหาอัลกอริทึมที่กำหนดชุดหนึ่งมันจะส่งคืนการเรียงสับเปลี่ยน "ถัดไป" ของชุดนั้นในลักษณะที่เรียกฟังก์ชันซ้ำ ๆ บนเอาต์พุตของตัวเองจะวนรอบการเรียงสับเปลี่ยนทั้งหมดของชุดเดิมใน คำสั่งบางอย่าง (คำสั่งซื้อใดไม่สำคัญ) มีอัลกอริทึมดังกล่าวหรือไม่? อัลกอริธึมการสร้างการเปลี่ยนแปลงส่วนใหญ่ที่ฉันเคยเห็นมักจะสร้างทั้งหมดพร้อมกัน (โดยปกติจะเรียกซ้ำ) ซึ่งไม่ได้ปรับขนาดเป็นชุดใหญ่มาก การใช้งานใน Clojure (หรือภาษาที่ใช้งานได้อื่น) จะเป็นประโยชน์ แต่ฉันสามารถหาได้จาก pseudocode

12
สร้างการเรียงสับเปลี่ยนทั้งหมดของรายการโดยไม่มีองค์ประกอบที่เท่ากันอยู่ติดกัน
เมื่อเราเรียงลำดับรายการเช่น a = [1,2,3,3,2,2,1] sorted(a) => [1, 1, 2, 2, 2, 3, 3] องค์ประกอบที่เท่ากันมักจะอยู่ติดกันในรายการผลลัพธ์ ฉันจะบรรลุภารกิจที่ตรงกันข้ามได้อย่างไร - สลับรายการเพื่อไม่ให้องค์ประกอบที่เท่ากัน (หรือแทบจะไม่เป็นไปได้) อยู่ติดกัน ตัวอย่างเช่นสำหรับรายการด้านบนหนึ่งในวิธีแก้ปัญหาที่เป็นไปได้คือ p = [1,3,2,3,2,1,2] เป็นทางการมากขึ้นให้รายการaสร้างการเปลี่ยนแปลงpp[i]==p[i+1]ของมันที่ช่วยลดจำนวนคู่ เนื่องจากรายการมีขนาดใหญ่การสร้างและกรองการเรียงสับเปลี่ยนทั้งหมดจึงไม่ใช่ทางเลือก คำถามโบนัส: จะสร้างการเรียงสับเปลี่ยนทั้งหมดอย่างมีประสิทธิภาพได้อย่างไร? นี่คือรหัสที่ฉันใช้เพื่อทดสอบการแก้ปัญหา: https://gist.github.com/gebrkn/9f550094b3d24a35aebd UPD: การเลือกผู้ชนะที่นี่เป็นทางเลือกที่ยากเพราะหลายคนโพสต์คำตอบที่ยอดเยี่ยม @VincentvanderWeele , @David Eisenstat , @Coady , @ enrico.bacisและ@srgergจัดเตรียมฟังก์ชันที่สร้างการเปลี่ยนแปลงที่ดีที่สุดได้อย่างไร้ที่ติ @tobias_kและ David ยังตอบคำถามโบนัส (สร้างการเรียงสับเปลี่ยนทั้งหมด) คะแนนเพิ่มเติมสำหรับเดวิดสำหรับการพิสูจน์ความถูกต้อง รหัสจาก @VincentvanderWeele ดูเหมือนจะเร็วที่สุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.