ฉันหวังว่าฉันสามารถมีส่วนร่วมกับสิ่งใหม่ในปัญหานี้ ฉันสังเกตเห็นว่าคำตอบทั้งหมดละเลยความจริงที่ว่ามีสองจุดที่คุณสามารถทำการประมวลผลล่วงหน้าได้โดยไม่ทำให้ประสิทธิภาพการซักโดยรวมของคุณช้าลง
นอกจากนี้เราไม่จำเป็นต้องสมมติถุงเท้าจำนวนมากแม้แต่สำหรับครอบครัวใหญ่ ถุงเท้าถูกนำออกมาจากลิ้นชักและสวมใส่แล้วพวกเขาจะถูกโยนในสถานที่ (อาจจะเป็นถังขยะ) ที่พวกเขาอยู่ก่อนที่จะถูกซัก ในขณะที่ฉันจะไม่เรียกว่า bin LIFO-Stack แต่ฉันว่ามันปลอดภัยที่จะสมมติ
- ผู้คนขว้างถุงเท้าทั้งคู่ลงในพื้นที่เดียวกันของถังขยะ
- ถังขยะไม่ได้ถูกสุ่ม ณ จุดใด ๆ ดังนั้น
- ชุดย่อยใด ๆ ที่นำมาจากด้านบนของถังขยะนี้โดยทั่วไปจะมีถุงเท้าทั้งคู่
เนื่องจากเครื่องซักผ้าที่ฉันรู้จักมีขนาด จำกัด (ไม่ว่าคุณจะต้องซักกี่ถุงเท้า) และการสุ่มเกิดขึ้นจริงในเครื่องซักผ้าไม่ว่าเราจะมีถุงเท้ากี่ตัวเราจึงมีชุดย่อย ๆ ซึ่งแทบจะไม่มีเลย singletons
ขั้นตอนก่อนการประมวลผลสองขั้นตอนของเราคือ "การวางถุงเท้าบนราวตากผ้า" และ "การถอดถุงเท้าจากราวตากผ้า" ซึ่งเราต้องทำเพื่อที่จะได้รับถุงเท้าที่ไม่เพียง แต่ทำความสะอาด แต่ยังแห้ง เช่นเดียวกับเครื่องซักผ้าราวตากผ้า จำกัด และฉันคิดว่าเรามีส่วนทั้งหมดของเส้นที่เราใส่ถุงเท้าของเราในสายตา
นี่คืออัลกอริทึมสำหรับ put_socks_on_line ():
while (socks left in basket) {
take_sock();
if (cluster of similar socks is present) {
Add sock to cluster (if possible, next to the matching pair)
} else {
Hang it somewhere on the line, this is now a new cluster of similar-looking socks.
Leave enough space around this sock to add other socks later on
}
}
อย่าเสียเวลาไปกับการเดินถุงเท้าหรือมองหาคู่ที่ดีที่สุดสิ่งนี้ควรทำใน O (n) ซึ่งเราก็ต้องการเพียงแค่วางมันลงบนเส้นที่ไม่ได้เรียง ถุงเท้ายังไม่ได้จับคู่เรามีกลุ่มที่คล้ายคลึงกันหลายรายการเท่านั้น มันมีประโยชน์มากที่เรามีถุงเท้าจำนวน จำกัด ที่นี่เนื่องจากมันช่วยให้เราสร้างกลุ่ม "ดี" (ตัวอย่างเช่นถ้ามีถุงเท้าสีดำในชุดถุงเท้าเท่านั้นการจัดกลุ่มตามสีจะไม่เป็นไปได้)
นี่คืออัลกอริทึมสำหรับ take_socks_from_line ():
while(socks left on line) {
take_next_sock();
if (matching pair visible on line or in basket) {
Take it as well, pair 'em and put 'em away
} else {
put the sock in the basket
}
ฉันควรชี้ให้เห็นว่าเพื่อปรับปรุงความเร็วของขั้นตอนที่เหลืออยู่ก็ไม่ควรสุ่มเลือกถุงเท้าถัดไป แต่ควรใช้ถุงเท้าหลังจากถุงเท้าแต่ละกลุ่มตามลำดับ ขั้นตอนการประมวลผลล่วงหน้าไม่ต้องใช้เวลามากไปกว่าแค่การวางถุงเท้าลงบนตะกร้าหรือในตะกร้าซึ่งเราต้องทำไม่ว่าอะไรจะเกิดขึ้น
หลังจากนี้เป็นเรื่องง่ายที่จะทำอัลกอริธึมการแบ่งแฮช โดยปกติแล้วถุงเท้าประมาณ 75% ถูกจับคู่แล้วปล่อยให้ฉันมีชุดย่อยถุงเท้าเล็ก ๆ และชุดย่อยนี้มีอยู่แล้ว (ค่อนข้าง) กลุ่ม (ฉันไม่แนะนำเอนโทรปีมากในตะกร้าของฉันหลังจากขั้นตอนก่อนการประมวลผล) อีกสิ่งหนึ่งคือกลุ่มที่เหลือมีแนวโน้มที่จะมีขนาดเล็กพอที่จะจัดการได้ในครั้งเดียวดังนั้นจึงเป็นไปได้ที่จะนำคลัสเตอร์ทั้งหมดออกจากตะกร้า
นี่คืออัลกอริทึมสำหรับ sort_remaining_clusters ():
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
หลังจากนั้นก็เหลือเพียงไม่กี่ถุงเท้า นี่คือที่ฉันแนะนำถุงเท้าที่ไม่มีคู่ก่อนหน้านี้เข้าสู่ระบบและประมวลผลถุงเท้าที่เหลือโดยไม่มีอัลกอริทึมพิเศษ - ถุงเท้าที่เหลืออยู่มีน้อยมากและสามารถประมวลผลได้อย่างรวดเร็วทางสายตา
สำหรับถุงเท้าที่เหลือทั้งหมดฉันคิดว่าคู่ของพวกเขายังไม่ได้ซักและนำพวกเขาออกไปสำหรับการทำซ้ำครั้งต่อไป หากคุณลงทะเบียนการเติบโตของถุงเท้าที่ไม่มีคู่เมื่อเวลาผ่านไป ("ถุงเท้ารั่ว") คุณควรตรวจสอบถังขยะของคุณ - มันอาจได้รับการสุ่ม (คุณมีแมวที่นอนอยู่ในนั้นหรือไม่)
ฉันรู้ว่าอัลกอริทึมเหล่านี้มีข้อสันนิษฐานมากมาย: ถังขยะซึ่งทำหน้าที่เหมือนกอง LIFO เครื่องซักผ้าธรรมดาแบบ จำกัด และราวตากผ้าธรรมดาแบบ จำกัด แต่ก็ยังใช้ได้กับถุงเท้าจำนวนมาก
เกี่ยวกับการขนาน: ตราบใดที่คุณโยนถุงเท้าทั้งสองลงในถังขยะเดียวกันคุณสามารถขนานขั้นตอนเหล่านั้นทั้งหมดได้อย่างง่ายดาย