สร้างการเรียงสับเปลี่ยนทั้งหมดของรายการโดยไม่มีองค์ประกอบที่เท่ากันอยู่ติดกัน
เมื่อเราเรียงลำดับรายการเช่น 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 ดูเหมือนจะเร็วที่สุด