ฉันจะจับคู่ถุงเท้าจากกองได้อย่างมีประสิทธิภาพได้อย่างไร


3911

เมื่อวานฉันจับคู่ถุงเท้าจากผ้าที่สะอาดและคิดวิธีที่ฉันทำมันไม่มีประสิทธิภาพมาก ฉันทำการค้นหาที่ไร้เดียงสา - เลือกถุงเท้าหนึ่งอันและ "วนซ้ำ" กองเพื่อหาคู่ เรื่องนี้ต้องมีการทำซ้ำมากกว่า n / 2 * n / 4 n = 2 /8 ถุงเท้าโดยเฉลี่ย

ในฐานะนักวิทยาศาสตร์คอมพิวเตอร์ฉันคิดว่าฉันจะทำอะไรได้บ้าง แน่นอนว่าการคัดแยก (ตามขนาด / สี / ... ) เป็นสิ่งสำคัญที่จะทำให้ได้โซลูชั่น O (NlogN)

การแฮ็กหรือโซลูชันอื่น ๆ ที่ไม่ใช่สถานที่ไม่ใช่ตัวเลือกเพราะฉันไม่สามารถทำซ้ำถุงเท้าของฉันได้ (แม้ว่ามันอาจจะดีถ้าฉันทำได้)

ดังนั้นคำถามคือโดยทั่วไป:

ด้วยnถุงเท้าคู่หนึ่งที่ประกอบด้วย2nองค์ประกอบ (สมมติว่าถุงเท้าแต่ละคู่มีคู่ที่ตรงกันหนึ่งคู่) วิธีที่ดีที่สุดในการจับคู่พวกเขาให้มีประสิทธิภาพคืออะไรกับพื้นที่พิเศษลอการิทึมมากที่สุด? (ฉันเชื่อว่าฉันสามารถจำจำนวนข้อมูลนั้นได้หากจำเป็น)

ฉันจะขอบคุณคำตอบที่กล่าวถึงประเด็นต่อไปนี้:

  • วิธีแก้ปัญหาเชิงทฤษฎีทั่วไปสำหรับถุงเท้าจำนวนมาก
  • จำนวนถุงเท้าที่แท้จริงนั้นไม่ใหญ่มากฉันไม่เชื่อคู่สมรสของฉันและฉันมีมากกว่า 30 คู่ (และมันค่อนข้างง่ายที่จะแยกแยะความแตกต่างระหว่างถุงเท้าของฉันและเธอ; สิ่งนี้สามารถใช้ได้เช่นกัน?)
  • มันเทียบเท่ากับปัญหาความแตกต่างขององค์ประกอบหรือไม่

448
ฉันใช้หลักการหลุมนกพิราบเพื่อจับคู่หนึ่งเดียวจากกองซักรีด ฉันมีถุงเท้า 3 สี (แดงน้ำเงินและเขียว) และแต่ละคู่ 2 สี ฉันเลือกถุงเท้า 4 ครั้งในแต่ละครั้งและฉันก็แต่งหน้าเป็นคู่เสมอและไปทำงาน
Srinivas

59
อีกหลักการของนกพิราบรู: ถ้าคุณใช้เซ็ตย่อยของถุงเท้า n / 2 +1 ต้องมีอย่างน้อยหนึ่งคู่ในเซตย่อยนี้
wildplasser

40
เป็นคำถามที่ดีมาก! คุณอาจสนใจบทความของฉันเกี่ยวกับปัญหาที่เกี่ยวข้องซึ่งเป็นการอภิปรายถึงความน่าจะเป็นในการดึงถุงเท้าที่จับคู่สองตัวออกมาจากกอง: blogs.msdn.com/b/ericlippert/archive/2010/03/22/ …
Eric Lippert

336
ทำไมไม่วางไข่เด็กและwaitpidในฐานะพ่อแม่คุณไม่แม้แต่จะเรียงถุงเท้าด้วยตัวเองล่ะ?
Mxyk

137
ฉันแก้ไขปัญหานี้โดยมีถุงเท้าสูงถึงเข่าสีขาวเท่านั้น พวกเขาทั้งหมดตรงกัน ฉันสามารถจับถุงเท้าสองอันใดก็ได้โดยการสุ่มจากกองและพวกเขาจะจับคู่กัน ฉันทำให้ปัญหาง่ายขึ้นโดยไม่จับคู่ถุงเท้า ฉันมีลิ้นชักถุงเท้าที่ฉันเพียงแค่โยนถุงเท้าทั้งหมดของฉันลงในคู่ที่ไม่มีคู่ ฉันจับสองตัวจากลิ้นชักทุกเช้า ฉันทำให้มันง่ายขึ้นถึง O (0) ไม่สามารถรับได้ง่ายกว่านั้น :)
ลี

คำตอบ:


2449

มีการเสนอโซลูชันการเรียงลำดับแต่การเรียงลำดับมีน้อยเกินไป : เราไม่ต้องการใบสั่ง เราก็ต้องกลุ่มเท่าเทียมกัน

ดังนั้นการคร่ำครวญจะเพียงพอ (และเร็วกว่า)

  1. สำหรับสีของถุงเท้าแต่ละรูปแบบกอง ย้ำกว่าถุงเท้าทั้งหมดในตะกร้าใส่ของคุณและแจกจ่ายพวกเขาลงบนกองสี
  2. วนซ้ำแต่ละกองและกระจายโดยตัวชี้วัดอื่น ๆ (เช่นรูปแบบ) ลงในกองชุดที่สอง
  3. ใช้รูปแบบนี้ซ้ำ ๆจนกว่าคุณจะแจกถุงเท้าทั้งหมดลงบนกองเล็ก ๆ ที่คุณสามารถเห็นได้ทันที

การแบ่งพาร์ติชันแฮชแบบเรียกซ้ำชนิดนี้กำลังดำเนินการโดยSQL Serverเมื่อต้องการแฮชการรวมหรือการแฮชรวมบนชุดข้อมูลขนาดใหญ่ มันกระจายการสร้างกระแสอินพุตของมันลงในหลาย ๆ พาร์ติชันซึ่งเป็นอิสระ โครงร่างนี้ปรับขนาดตามจำนวนข้อมูลโดยพลการและ CPU หลายตัวเป็นเส้นตรง

คุณไม่จำเป็นต้องมีการแบ่งพาร์ติชันแบบเรียกซ้ำหากคุณสามารถค้นหาคีย์การแจกจ่าย (คีย์แฮช) ที่มีที่เก็บข้อมูลเพียงพอที่แต่ละที่ฝากข้อมูลมีขนาดเล็กพอที่จะประมวลผลได้อย่างรวดเร็ว น่าเสียดายที่ฉันไม่คิดว่าถุงเท้ามีคุณสมบัติเช่นนี้

หากถุงเท้าแต่ละอันมีจำนวนเต็มที่เรียกว่า "PairID" หนึ่งตัวสามารถแจกจ่ายไปยัง 10 buckets ได้อย่างง่ายดายตามPairID % 10(หลักสุดท้าย)

การแบ่งพาร์ติชันในโลกแห่งความจริงที่ดีที่สุดที่ฉันนึกได้คือการสร้างเสาเข็มสี่เหลี่ยมผืนผ้า : มิติหนึ่งคือสีส่วนอีกอันคือลวดลาย ทำไมต้องเป็นสี่เหลี่ยมผืนผ้า? เพราะเราต้องการ O (1) เข้าถึงแบบสุ่มไปยังกอง ( คิวบ์ 3 มิติก็สามารถใช้ได้เช่นกัน แต่ก็ไม่ได้เป็นประโยชน์จริง ๆ )


ปรับปรุง:

สิ่งที่เกี่ยวกับการขนาน ? มนุษย์หลายคนสามารถจับคู่ถุงเท้าได้เร็วขึ้นหรือไม่

  1. กลยุทธ์การทำคู่ขนานที่ง่ายที่สุดคือให้คนงานหลายคนนำออกจากตะกร้าใส่และวางถุงเท้าลงบนกอง มีขนาดเท่านี้มาก - ลองนึกภาพคน 100 คนต่อสู้กว่า 10 กอง ค่าใช้จ่ายในการซิงโครไนซ์ (แสดงให้เห็นว่าเป็นการชนกันของมือและการสื่อสารของมนุษย์) ทำลายประสิทธิภาพและเพิ่มความเร็ว (ดูกฎหมาย Universal Scalability !) สิ่งนี้มีแนวโน้มที่จะหยุดชะงักหรือไม่? ไม่เพราะคนงานแต่ละคนต้องการเข้าถึงเสาเข็มทีละครั้งเท่านั้น ด้วย "ล็อค" เพียงหนึ่งเดียวจะไม่มีการหยุดชะงัก Livelocksอาจเป็นไปได้ขึ้นอยู่กับวิธีที่มนุษย์ประสานการเข้าถึงกอง พวกเขาอาจใช้backoff แบบสุ่มเช่นเดียวกับการ์ดเครือข่ายในระดับกายภาพเพื่อพิจารณาว่าการ์ดใดสามารถเข้าถึงสายเครือข่ายได้โดยเฉพาะ ถ้ามันใช้ได้กับนิคส์มันก็ใช้ได้กับมนุษย์เช่นกัน
  2. เครื่องชั่งน้ำหนักมันเกือบไปเรื่อย ๆ ถ้าพนักงานแต่ละคนมีชุดของตัวเองของกอง จากนั้นคนงานสามารถนำถุงเท้าขนาดใหญ่ออกจากตระกร้าอินพุต (ความขัดแย้งน้อยมากขณะที่ทำมันไม่ค่อย) และพวกเขาไม่จำเป็นต้องซิงโครไนซ์เมื่อทำการกระจายถุงเท้าเลย (เพราะมีกองด้ายในตัว) ในตอนท้ายคนงานทุกคนต้องรวมกลุ่มกอง ผมเชื่อว่าสามารถทำได้ใน O (เข้าสู่ระบบ (นับคนงาน * กองต่อคนงาน)) ถ้าคนงานในรูปแบบต้นไม้รวม

สิ่งที่เกี่ยวกับปัญหาองค์ประกอบแตกต่าง ? O(N)ในฐานะที่เป็นรัฐบทความปัญหาองค์ประกอบความแตกต่างที่สามารถแก้ไขได้ใน นี้เป็นเหมือนกันสำหรับปัญหาถุงเท้า (หรือO(N)ถ้าคุณต้องการเพียงขั้นตอนการกระจายหนึ่ง (ผมเสนอหลายขั้นตอนเพียงเพราะมนุษย์ที่ไม่ดีในการคำนวณ - ขั้นตอนเดียวก็พอถ้าคุณแจกจ่ายบนmd5(color, length, pattern, ...), เช่นกัญชาที่สมบูรณ์แบบของคุณลักษณะทั้งหมด))

เห็นได้ชัดว่าหนึ่งไม่สามารถไปได้เร็วขึ้นกว่าO(N)ดังนั้นเราจึงได้มาถึงที่ดีที่สุดที่ต่ำกว่าที่ถูกผูกไว้

แม้ว่าผลลัพธ์จะไม่เหมือนกันทุกประการ (ในกรณีหนึ่งเพียงแค่บูลีนในอีกกรณีหนึ่งคู่ของถุงเท้า) ความซับซ้อนเชิงซีมโทติคก็เหมือนกัน


72
นี่คือสิ่งที่ฉันทำ! ฉันทำให้กองขึ้นอยู่กับรูปแบบของการเปิดถุงเท้า (ฉันมีสีขาวเท่านั้น) ซึ่งทำให้ฉัน "ถัง" มากพอที่จะจับคู่แต่ละคนได้อย่างรวดเร็ว
Scott Chamberlain

29
ฉันลองสิ่งนี้กับถุงเท้าของฉัน (ฉันมี 30 คู่ขึ้นไป) และผู้ชายมันเร็ว ปัญหาหนึ่งที่ฉันพบคือเมื่อฉันไม่สามารถอัลกอริทึมแฮชที่ดีพอ (ฉันมีถุงเท้าสีขาวจำนวนมากที่ไม่มีรูปแบบใด ๆ ) ดังนั้นจึงกลายเป็นเรื่องยาก ในกรณีนั้นสิ่งที่จะเป็นวิธีที่ดีที่สุดที่จะทำมัน?
NothingsImpossible

56
@NothingsImpossible นั่นเป็นวิธีที่การโจมตีของการชนกันของข้อมูลรู้สึกเหมือนเว็บเซิร์ฟเวอร์ที่ไม่ดี! ถุงเท้าสีขาวมีความแตกต่างจากคุณสมบัติบางอย่างหรือไม่? ต้องมีบางสิ่งที่คุณสามารถแจกจ่ายได้ มิฉะนั้นคุณสามารถสร้างคู่ให้โดยพลการ
usr

37
นี่คือ Radix Sort ซึ่งฉันยอมรับว่าเป็นคำตอบที่ถูกต้อง @ MarkPeters ฉันไม่คิดว่าคุณต้องการตารางการค้นหา การส่งผ่านแบบเส้นตรงเดียวเหนือถุงเท้าสามารถแปลงถุงเท้าเป็นเวกเตอร์จำนวนทำให้การแมปของ "ส่วนของถุงเท้า" เป็นถังเล็ก ๆ น้อย ๆ ถุงเท้าสามารถผูกติดกับเวกเตอร์ด้วยเชือกเพื่อที่คุณจะได้ไม่ต้องผ่านเส้นตรงอีกต่อไปในตอนท้าย
Pointy

49
ผู้ชายที่ฉันไปวิทยาลัยที่มี PairID จริง ๆ มันถูกเย็บลงบนถุงเท้าแต่ละคู่ด้วยด้าย: 1, 2, 3, 4 ...
Ryan Lundy

579

เนื่องจากสถาปัตยกรรมของสมองมนุษย์แตกต่างจาก CPU สมัยใหม่อย่างสิ้นเชิงคำถามนี้ไม่สมเหตุสมผล

มนุษย์สามารถเอาชนะอัลกอริทึมของ CPU โดยใช้ข้อเท็จจริงที่ว่า "การหาคู่ที่ตรงกัน" สามารถเป็นหนึ่งในการดำเนินการสำหรับชุดที่ไม่ใหญ่เกินไป

อัลกอริทึมของฉัน:

spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}

อย่างน้อยนี่คือสิ่งที่ฉันใช้ในชีวิตจริงและฉันพบว่ามันมีประสิทธิภาพมาก ข้อเสียคือมันต้องมีพื้นผิวเรียบ แต่มักจะมีมาก


229
เมื่อจำนวนถุงเท้าเพิ่มขึ้น SIMD ของมนุษย์ก็ไม่ได้ดีไปกว่าซีพียู
โกหก Ryan

25
คำตอบที่ดีที่สุด IMO ในขณะที่มันสนุกและฉลาด (และเหมาะสมกับ SO) เพื่อลดปัญหาแบบวันต่อวันให้กับอัลกอริธึมของคอมพิวเตอร์ แต่มันก็สมเหตุสมผลดีกว่าที่จะใช้พลังการแก้ปัญหาของตา / สมองของมนุษย์
drug_user841417

13
@LieRyan หากถุงเท้ามีการกระจายอย่างสม่ำเสมอคุณจะเห็นคู่ของถุงเท้าเล็ก ๆ พอสมควรเนื่องจากวันเกิดความขัดแย้ง (เว้นแต่คุณสามารถแยกแยะสีเพื่อความแม่นยำโดยพลการซึ่งฉันสงสัย) ดังนั้นคอขวดที่นี่จะไม่เป็นเช่นนั้น อัลกอริทึมการจับคู่สีมนุษย์ แต่ขั้นตอนการแพร่กระจาย
โทมัส

13
@ dpc.ucore.info ไม่เพราะพวกเขามีรูปแบบการถักข้อมือที่แตกต่างกันความยาวข้อมือความยาวโดยรวมและเฉดสีดำ (ภรรยาของฉันอาจจะทำร้ายฉันในช่วงสุดท้าย)
Christian

200
คุณหวังว่าคุณจะมีถุงเท้าจำนวนมากมิฉะนั้นคุณจะเป็นถุงเท้าพับได้เป็นเวลานาน ...
Patrick James McDougle

258

กรณีที่ 1 : ถุงเท้าทั้งหมดเหมือนกัน (นี่คือสิ่งที่ฉันทำในชีวิตจริงตามทาง)

เลือกคู่ใดก็ได้เพื่อสร้างคู่ เวลาคงที่

กรณีที่ 2 : มีชุดค่าผสมจำนวนคงที่ (ความเป็นเจ้าของสีขนาดพื้นผิว ฯลฯ )

ใช้Radix การจัดเรียง นี่เป็นเพียงเวลาเชิงเส้นเนื่องจากไม่จำเป็นต้องทำการเปรียบเทียบ

กรณีที่ 3 : ไม่ทราบจำนวนชุดค่าผสมล่วงหน้า (กรณีทั่วไป)

เราต้องทำการเปรียบเทียบเพื่อตรวจสอบว่ามีถุงเท้าสองคู่มาหรือไม่ เลือกหนึ่งในO(n log n)อัลกอริทึมการเรียงลำดับแบบอิงการเปรียบเทียบ

อย่างไรก็ตามในชีวิตจริงเมื่อจำนวนถุงเท้ามีขนาดค่อนข้างเล็ก (คงที่) อัลกอริธึมที่เหมาะสมที่สุดในทางทฤษฎีเหล่านี้จะทำงานได้ไม่ดี อาจใช้เวลามากกว่าการค้นหาตามลำดับซึ่งในทางทฤษฎีต้องใช้เวลากำลังสอง


8
> อาจใช้เวลามากกว่าการค้นหาตามลำดับซึ่งต้องใช้เวลากำลังสองในทางทฤษฎี ใช่นั่นคือเหตุผลที่ฉันเกลียดการทำเช่นนี้บางทีฉันควรทิ้งถุงเท้าของฉันทั้งหมดและเริ่มต้นด้วยกรณีที่ 1.
นิลส์

57
ด้านล่างของการมีถุงเท้าที่เหมือนกันคือพวกเขามักจะอายุในอัตราที่แตกต่างกัน ดังนั้นคุณยังคงพยายามที่จะจับคู่พวกเขาตามวิธีการที่พวกเขาสวมใส่ (ซึ่งยากกว่าการจับคู่ตามรูปแบบ)
SDC

118
ปัญหาของการมีถุงเท้าที่เหมือนกัน 60 คู่ "เพราะทำให้การจับคู่ง่ายขึ้น" ก็คือมันทำให้ผู้คนรู้สึกว่าคุณทำงานกับคอมพิวเตอร์
Steve Ives

13
กรณีที่ 1ไม่ใช่เวลาคงที่เมื่อมีการดำเนินการที่เกี่ยวข้องเช่นการพับคู่เข้าด้วยกัน ในกรณีนี้มันเป็นเวลาเชิงเส้นที่มีปัจจัยคงที่ที่เล็กที่สุด หนึ่งอาจไม่สามารถพับในเวลาเดียวกันหนึ่งคู่และเต็มไปด้วยถุงเท้า อย่างไรก็ตามมันมีขนาดเป็นเส้นตรง ตามกฎหมายของ Amdahl มันมีการเร่งความเร็วแบบไม่ จำกัด โดยไม่สนใจค่าใช้จ่าย ตามกฎหมายของ Gustafson คุณสามารถพับได้หลายคู่เท่าที่จะทำได้เพื่อพับหนึ่งคู่ให้แรงงานเพียงพอ (จำนวนที่เหลือสำหรับการออกกำลังกายสำหรับผู้อ่าน) โดยไม่สนใจค่าใช้จ่าย
acelent

7
@ PauloMadeira การเรียงลำดับเป็นเวลาคงที่ - คุณเพียงแค่กองและใส่ไว้ในลิ้นชัก การดำเนินการเฉพาะในกรณีนี้คือการวางถุงเท้าบนเท้าของคุณซึ่งเป็นค่าคงที่ ประสิทธิภาพนั้นได้มาจากการสวมถุงเท้าที่เลื่อนออกไปอาจมีการเสียสละในอวกาศบางส่วน (พื้นที่ที่ใช้ของถุงเท้าที่ไม่ได้พับนั้นมีขนาดใหญ่กว่าพับ) ฉันยืนยันว่ามันคุ้มค่า ฉันมักจะสูญเสียเรื่องนี้กับภรรยาของฉัน
Travis

157

คำตอบที่ไม่ใช่อัลกอริทึม แต่ "มีประสิทธิภาพ" เมื่อฉันทำ:

  • ขั้นตอนที่ 1) ทิ้งถุงเท้าที่มีอยู่ทั้งหมดของคุณ

  • ขั้นตอนที่ 2) ไปที่Walmartและซื้อโดยใช้แพ็คเก็ตขนาด 10 - n แพ็คเก็ตสีขาวและสีดำแพ็คเก็ต m ไม่ต้องการสีอื่น ๆ ในชีวิตประจำวัน

แต่บางครั้งฉันต้องทำเช่นนี้อีกครั้ง (ถุงเท้าที่หายไปถุงเท้าที่ชำรุด ฯลฯ ) และฉันเกลียดที่จะทิ้งถุงเท้าที่ดีอย่างสมบูรณ์แบบบ่อยเกินไป (และฉันหวังว่าพวกเขายังคงขายถุงเท้าอ้างอิงเดียวกัน!) ดังนั้นเมื่อเร็ว ๆ นี้ แนวทางที่แตกต่าง

คำตอบขั้นตอน:

ลองพิจารณาดูว่าถ้าคุณวาดถุงเท้าเพียงถุงเท้าเดียวสำหรับถุงเท้าชุดที่สองในขณะที่คุณกำลังทำอยู่อัตราต่อรองในการหาถุงเท้าที่ตรงกันในการค้นหาที่ไร้เดียงสาค่อนข้างต่ำ

  • ดังนั้นหยิบห้าของพวกเขาโดยการสุ่มและจดจำรูปร่างหรือความยาวของพวกเขา

ทำไมถึงห้า โดยปกติแล้วมนุษย์มักจะจำได้ดีระหว่างห้าถึงเจ็ดองค์ประกอบที่แตกต่างกันในหน่วยความจำในการทำงาน - บิตเช่นเดียวกับมนุษย์เทียบเท่ากับRPN stack - ห้าเป็นค่าเริ่มต้นที่ปลอดภัย

  • รับหนึ่งจากกอง 2n-5

  • ตอนนี้มองหาการจับคู่ (การจับคู่รูปแบบภาพ - มนุษย์นั้นเก่งในกองเล็ก ๆ ) ภายในห้าตัวที่คุณวาดหากคุณไม่พบหนึ่งตัวจากนั้นเพิ่มส่วนนั้นลงในห้าตัวของคุณ

  • ทำการสุ่มเลือกถุงเท้าจากสแต็กและเปรียบเทียบกับถุงเท้า 5 + 1 ของคุณสำหรับการแข่งขัน เมื่อสแต็คของคุณเติบโตขึ้นมันจะลดประสิทธิภาพ แต่เพิ่มโอกาสของคุณ เร็วขึ้นมาก

อย่าลังเลที่จะเขียนสูตรเพื่อคำนวณจำนวนตัวอย่างที่คุณต้องจับในการแข่งขัน 50% IIRC เป็นกฎ hypergeometric

ฉันทำอย่างนั้นทุกเช้าและไม่ค่อยต้องการการจับมากกว่าสามครั้ง - แต่ฉันมีถุงเท้าสีขาวที่มีรูปร่างnคล้ายกัน (ประมาณ 10 คู่ให้หรือนำที่หายไป) mตอนนี้คุณสามารถประมาณขนาดของกองหุ้นของฉัน :-)

BTWฉันพบว่าผลรวมของค่าใช้จ่ายในการทำธุรกรรมการคัดแยกถุงเท้าทุกครั้งที่ฉันต้องการคู่ก็น้อยกว่าการทำหนึ่งครั้งและผูกถุงเท้า การใช้เวลาทำงานได้ดีขึ้นเพราะคุณไม่ต้องผูกถุงเท้าและยังมีผลตอบแทนเล็กน้อยที่ลดลง (นั่นคือคุณกำลังมองหาถุงเท้าสองหรือสามตัวที่เมื่ออยู่ในที่ซักผ้าและคุณต้องการ เพื่อเสร็จสิ้นการจับคู่ถุงเท้าของคุณและคุณเสียเวลากับเรื่องนั้น)


25
โหวตขึ้นสำหรับคำตอบ 'ไม่ใช่อัลกอริทึม' นี่คือสิ่งที่ฉันทำและใช้งานได้อย่างมหัศจรรย์ ปัญหาการเปลี่ยนไม่ได้เป็นปัญหาหากคุณ 'หมุน' ถุงเท้าของคุณด้วยการวางถุงเท้าซักด้านหลังและดึงออกมาจากด้านหน้าของลิ้นชักในตอนเช้า ถุงเท้าทั้งหมดสวมใส่อย่างเท่าเทียมกัน เมื่อฉันเริ่มสังเกตเห็นการสึกหรอในหนึ่งฉันใส่ในรายการช้อปปิ้งเพื่อแทนที่ถุงเท้าทั้งชั้น สำหรับถุงเท้าเก่าฉันให้ค่าความนิยม 20% ที่ดีที่สุด (ผูกไว้ในถุงของชำเพื่อที่พวกเขาจะไม่ได้ปะปนกัน) และตั้งส่วนที่เหลือ ตอนนี้คุณไม่ได้สูญเสียถุงเท้า 80% เหลือเพียง 6 เดือนเท่านั้น
FastAl

2
BTW (1) การผูกถุงเท้าของคุณส่งผลให้ยางยืดตัวหนึ่งถูกยืดออกและจะล้มเหลวเร็วกว่ามาก การ จำกัด ชนิดของถุงเท้าที่ไม่เหมือนใครที่คุณผูกมัด (2) ข้อเสียของการ จำกัด ถุงเท้าที่ไม่เหมือนใครก็คือสำหรับผู้ที่มีปัญหาเกี่ยวกับแฟชั่นวิธีการอาจไม่เหมาะสม
FastAl

3
ฉันมาที่นี่โดยเฉพาะเพื่อโพสต์คำตอบ "ไม่ใช่อัลกอริทึม" ของคุณ ในด้านวิทยาศาสตร์คอมพิวเตอร์จริง ๆ คนส่วนใหญ่ไม่เคยให้ความสนใจกับข้อมูลและโครงสร้างของมันมากพอ
bkconrad

ฉันใช้วิธีอัลกอริทึมนี้ทุกเช้าและใช้งานได้อย่างมีเสน่ห์! นอกจากนี้ฉันใส่ถุงเท้าที่ชำรุดไปกองอื่นเพื่อทิ้งในภายหลัง (น่าเสียดายที่พวกเขาจัดการเพื่อไปที่กองเดิมอีกครั้งก่อนที่ฉันจะหาเวลาทิ้งขยะ)
Donatas Olsevičius

3
« n แพ็คเก็ตสีขาวและ m แพ็คเก็ตสีดำ ไม่จำเป็นต้องมีสีอื่น ๆ ในชีวิตประจำวัน»กฎมาตรฐานที่ดีสำหรับการเลือกถุงเท้าที่ง่ายคือจริง ๆ แล้วพวกเขาควรตรงกับสีของกางเกงของคุณหรือสีของเข็มขัดของคุณ ด้วยเหตุผลนี้สีที่ใช้บ่อยที่สุดน่าจะเป็นสีดำสีน้ำเงินสีเทาและสีน้ำตาลบางส่วน มันยากที่จะเชื่อว่าต้องการถุงเท้าสีขาวจำนวนมาก
Andrea Lazzarotto

106

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

วิธีการนี้สามารถนำมาใช้ได้อย่างง่ายดายในอาเรย์โดยสมมติว่าการถอดถุงเท้าเป็นตัวเลือก จริงๆแล้วคุณไม่จำเป็นต้อง "ถอด" ถุงเท้าด้วยซ้ำ หากคุณไม่ต้องการเรียงถุงเท้า (ดูด้านล่าง) คุณสามารถเลื่อนไปมาและจบลงด้วยอาร์เรย์ที่มีถุงเท้าทั้งหมดจัดเรียงเป็นคู่ในอาร์เรย์

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

แน่นอนว่าการเรียงลำดับช่วยเพิ่มประสิทธิภาพโดยเฉพาะอย่างยิ่งในชีวิตจริงที่คุณสามารถ "ใส่" ถุงเท้าระหว่างถุงเท้าสองคู่ได้อย่างง่ายดาย ในการคำนวณต้นไม้สามารถทำได้เหมือนกัน แต่นั่นเป็นพื้นที่เพิ่มเติม และแน่นอนเรากลับมาที่ NlogN (หรือมากกว่านั้นอีกเล็กน้อยหากมีถุงเท้าหลายตัวที่เหมือนกันโดยใช้เกณฑ์การเรียงลำดับ แต่ไม่ใช่จากคู่เดียวกัน)

นอกจากนั้นฉันไม่สามารถคิดอะไรได้เลย แต่วิธีนี้ดูเหมือนจะมีประสิทธิภาพในชีวิตจริง :)


7
นี่ก็เป็นสิ่งที่ฉันทำด้วย (โปรดสังเกตว่าถ้าคุณออกจากช่องว่างแล้วส่วนแทรกก็คือ O (1)) แต่มันจะลดขนาดด้วยถุงเท้าจำนวนมากตามหลักวิชา
Mooing Duck

15
เครื่องชั่งน้ำหนักไม่ดีที่มีจำนวนมากในทางทฤษฎีของประเภทถุงเท้า
สตีเว่น Lu

@StevenLu - อย่างที่ฉันบอก - มันคือ n * n หรือ nLogn ขึ้นอยู่กับว่าคุณเรียงลำดับหรือไม่ ดังนั้นจึงปรับขนาดได้ไม่ดีเท่าอัลกอริทึมการเรียงลำดับใด ๆ ถ้าคุณต้องการเร็วกว่าให้เรียงหมายเลขพวกเขาและใช้การจัดเรียงฐาน
Vilx-

นี่คือการจัดเก็บถุงเท้าที่พบ แต่ไม่จับคู่เป็นหลักในการค้นหาแบบแฮช ด้วยแฮชที่เหมาะสมที่สุดคือ O (n) แต่ถ้าคุณมีถุงเท้าเพียงพอที่เก็บไว้ว่าแฮชเริ่มเสื่อมสภาพมันจะซับซ้อนมากขึ้นตามลำดับ
Jon Hanna

3
การใส่ถุงเท้าระหว่าง 2 ถุงเท้าอื่น ๆ มีค่าเท่าไหร่ถึงจะเป็นเป้าหมายในการจับคู่ถุงเท้า ไม่มีความสำคัญเชิงถุงเท้า : -x
JoeBrockhaus

60

นี่กำลังถามคำถามที่ผิด คำถามที่ถูกถามคือทำไมฉันถึงใช้ถุงเท้าคัดแยกเวลา? มีค่าใช้จ่ายเท่าไหร่ต่อปีเมื่อคุณให้ความสำคัญกับเวลาว่างสำหรับหน่วยการเงิน X ที่คุณเลือก

และบ่อยกว่าไม่นี้ไม่ได้เป็นเพียงใดเวลาว่างก็ตอนเช้าเวลาว่างซึ่งคุณสามารถใช้จ่ายบนเตียงหรือจิบกาแฟของคุณหรือปล่อยให้เร็วขึ้นและไม่ถูกจราจรติดขัด

มันเป็นการดีที่จะถอยห่างออกไปและคิดหาวิธีแก้ปัญหา

และมีวิธีคือ!

ค้นหาถุงเท้าที่คุณชอบ คำนึงถึงคุณสมบัติที่เกี่ยวข้องทั้งหมด: สีในสภาพแสงที่แตกต่างกันคุณภาพโดยรวมและความทนทานความสะดวกสบายในสภาพภูมิอากาศที่แตกต่างกันและการดูดซับกลิ่น ที่สำคัญคือพวกเขาไม่ควรสูญเสียความยืดหยุ่นในการจัดเก็บดังนั้นผ้าธรรมชาติจึงเป็นสิ่งที่ดีและควรมีห่อพลาสติก

มันจะดีกว่าถ้าถุงเท้าเท้าซ้ายและเท้าขวาไม่มีความแตกต่าง แต่ก็ไม่สำคัญ หากถุงเท้ามีความสมมาตรซ้ายขวาการหาคู่คือการดำเนินการ O (1) และการเรียงลำดับถุงเท้าเป็นการดำเนินการโดยประมาณ O (M) โดยที่ M คือจำนวนสถานที่ในบ้านของคุณซึ่งคุณทิ้งขยะด้วยถุงเท้า จำนวนคงที่ขนาดเล็ก

หากคุณเลือกคู่แฟนซีที่มีถุงเท้าซ้ายและขวาที่แตกต่างกันให้เลือกถังเต็มถังไปทางซ้ายและขวาถังเก็บ O (N + M) โดยที่ N คือจำนวนถุงเท้าและ M เท่ากับข้างต้น คนอื่นสามารถให้สูตรสำหรับการคำนวณซ้ำโดยเฉลี่ยในการหาคู่แรก แต่กรณีที่แย่ที่สุดในการหาคู่ที่มีการค้นหาแบบตาบอดคือ N / 2 + 1 ซึ่งกลายเป็นกรณีที่ไม่น่าเป็นไปได้ทางดาราศาสตร์สำหรับ N ที่เหมาะสม อัลกอริธึมการจดจำและการวิเคราะห์พฤติกรรมเมื่อสแกนกองถุงเท้าที่ไม่เรียงลำดับด้วยMk1 Eyeballลูกตา

ดังนั้นอัลกอริทึมสำหรับการบรรลุประสิทธิภาพการจับคู่ถุงเท้า O (1) (สมมติว่าสมมาตรถุงเท้า) คือ:

  1. คุณต้องประเมินจำนวนถุงเท้าที่คุณจะต้องใช้ตลอดชีวิตที่เหลือของคุณหรือบางทีจนกว่าคุณจะเกษียณและย้ายไปยังภูมิอากาศที่อบอุ่นโดยไม่ต้องสวมถุงเท้าอีกต่อไป หากคุณยังเด็กคุณสามารถประมาณระยะเวลาที่ใช้ก่อนที่เราจะมีหุ่นยนต์คัดถุงเท้าในบ้านของเราและปัญหาทั้งหมดจะไม่เกี่ยวข้อง

  2. คุณต้องค้นหาวิธีการสั่งซื้อถุงเท้าที่คุณเลือกเป็นกลุ่มและราคาเท่าไหร่และจะส่งมอบอย่างไร

  3. สั่งซื้อถุงเท้า!

  4. กำจัดถุงเท้าเก่าของคุณ

อีกทางเลือกหนึ่งขั้นตอนที่ 3 จะเกี่ยวข้องกับการเปรียบเทียบค่าใช้จ่ายในการซื้อถุงเท้าจำนวนเท่ากันอาจจะถูกกว่าคู่ละครั้งในช่วงหลายปีที่ผ่านมาและเพิ่มค่าใช้จ่ายในการคัดแยกถุงเท้า แต่ใช้คำพูดของฉัน: ถุงเท้าในการจัดเก็บเพิ่มมูลค่าในอัตราเงินเฟ้อราคาหุ้นซึ่งเป็นมากกว่าที่คุณจะได้รับจากการลงทุนจำนวนมาก จากนั้นอีกครั้งยังมีค่าใช้จ่ายในการจัดเก็บ แต่ถุงเท้าไม่ได้ใช้พื้นที่มากบนชั้นวางของตู้เสื้อผ้า

แก้ไขปัญหา. ดังนั้นเพียงแค่ได้รับถุงเท้าใหม่โยน / บริจาคของเก่าออกไปและใช้ชีวิตอย่างมีความสุขหลังจากที่รู้ว่าคุณประหยัดเงินและเวลาทุกวันตลอดชีวิตที่เหลือของคุณ


อายุการใช้งาน (สมมติว่า 75 ปี) อุปทานของถุงเท้า (สมมติว่าคุณหมด 4 คู่ / เดือนที่ทำให้ 3600 คู่) จะใช้เวลา (สมมติว่าถุงเท้าคู่ใหม่ใช้เวลา 20 ลูกบาศก์นิ้ว) รวม 1 1/2 ลูกบาศก์หลา นั่นคือพื้นที่จำนวนมหาศาล สมมติว่าพวกเขาส่งไปให้คุณในกล่องที่มีลูกบาศก์ประมาณหนึ่งลังที่จะอยู่ด้านข้างประมาณ 3 ฟุต 4 นิ้ว
AJMansfield

2
@AJMansfield ข้อกังวลที่ถูกต้อง อย่างไรก็ตามฉันไม่เห็นด้วยกับตัวเลขบางส่วนของคุณ ฉันใช้เวลาเพียง 40 ปี (25 ... 65) (ช่วงเวลาที่ไม่ได้อยู่กับพ่อแม่ / หอพัก / ฯลฯ และออกจากตำแหน่งดูด้านบน) นอกจากนี้ฉันคิดว่าหนึ่งคู่ใช้เวลามากกว่าเช่น 0,5x4x6 นิ้วในบรรจุภัณฑ์เดิม ตัวเลขเหล่านี้ทำให้พื้นที่ของคุณลดลงไปเล็กน้อย!
hyde

ขั้นตอนที่ 4 สิ้นเปลืองโดยไม่จำเป็น -1
Dan Bechard

2
คำแนะนำสำหรับคนอื่น ๆ ที่อาจสับสนกับการวัดของ AJMansfield การแปลเป็นตัวชี้วัด: »จะใช้เวลา (สมมติว่าถุงเท้าคู่ใหม่ใช้เวลา 327 ซม. ³) รวมทั้งหมด 1.14 m³ นั่นคือพื้นที่จำนวนมหาศาล สมมติว่าพวกเขาส่งมอบมันให้กับคุณในกล่องที่มีขนาดประมาณหนึ่งลูกบาศก์ลังนั้นจะอยู่ที่ด้านข้างประมาณ 1.04 เมตร«
Joey

คำถามที่มีความอยากรู้อยากเห็นจะเป็น "คำถามที่ผิด" ได้อย่างไร? Classic StackOverflow ...
Timmmm

52

ขีด จำกัด ทางทฤษฎีคือ O (n) เพราะคุณต้องแตะถุงเท้าแต่ละอัน (ยกเว้นบางคู่จะจับคู่กัน)

คุณสามารถบรรลุ O (n) กับสมุฎฐานการจัดเรียง คุณเพียงแค่ต้องเลือกคุณลักษณะบางอย่างสำหรับถัง

  1. ก่อนอื่นคุณสามารถเลือก (เธอ, เหมือง) - แบ่งออกเป็น 2 กอง
  2. จากนั้นใช้สี (สามารถมีคำสั่งใด ๆ สำหรับสีเช่นตามตัวอักษรตามชื่อสี) - แบ่งออกเป็นกองด้วยสี (จำไว้ว่าให้ลำดับแรกจากขั้นตอนที่ 1 สำหรับถุงเท้าทั้งหมดในกองเดียวกัน)
  3. ความยาวของถุงเท้า
  4. จากนั้นพื้นผิว

หากคุณสามารถเลือกแอตทริบิวต์ได้ในจำนวนที่ จำกัด แต่มีคุณสมบัติเพียงพอที่สามารถระบุแต่ละคู่ได้โดยเฉพาะคุณควรทำใน O (k * n) ซึ่งก็คือ O (n) หากเราพิจารณาว่า k มีจำนวน จำกัด


3
ถุงเท้ามักจะมาใน 4 แพ็คและใหญ่กว่าเนื่องจากมีราคาถูกกว่า แต่ก็ทำให้พวกเขาแยกไม่ออก เพื่อตอบโต้เรื่องนี้ภรรยาของฉันเย็บเครื่องหมายเล็ก ๆ ลงบนถุงเท้าคู่ใหม่แต่ละคู่ที่ฉันซื้อ เครื่องหมายมีสีแตกต่างกันสำหรับแต่ละคู่หรือมีรูปร่างแตกต่างกันถ้าเธอไม่มีสี ด้วยวิธีนี้คุณไม่จำเป็นต้องมีชุดคุณสมบัติที่ จำกัด เพียงแค่เย็บหมายเลขที่ไม่ซ้ำกันในแต่ละคู่ :) สำหรับคะแนนพิเศษใช้เลขฐานสอง
Vilx-

29
@ Vilx- ทำไมล่ะ!? ไม่ใช่ประเด็นทั้งหมดที่พวกเขาแยกไม่ออก?
flup

2
@flup - ฉันคิดว่าจุดรวมคือการขายในชุดใหญ่ :) สำหรับฉันมันช่วยให้พวกเขาสวมเป็นคู่ ไม่งั้นฉันจะได้ถุงเท้าที่สวมใส่สามใบและถุงเท้าใหม่ คินดี้โง่
Vilx-

13
ฉันไม่เห็นด้วยกับการคำนวณ O (n) $ k $ คืออะไร $ k $ คือจำนวนแอตทริบิวต์ ฉันจะเถียง $ k $ คือ $ O (log n) $ เพราะมันต้องเพียงพอที่จะระบุแต่ละคู่โดยไม่ซ้ำกัน หากคุณมี 2 คู่ (ขาวดำ) สี ($ k = 1, n = 2 $) ก็เพียงพอแล้ว หากคุณมีสีดำคู่หนึ่งสั้น หนึ่งคู่ของสีดำยาว หนึ่งคู่สีขาวสั้น และหนึ่งคู่สีขาวยาว - จากนั้น $ k = 2, n = 4 $ ถ้าเรา จำกัด $ k $ เราก็จะ จำกัด $ n $ ในเวลาเดียวกัน หากเรากำลังจะ จำกัด $ n $ การคำนวณคำสั่งซื้อจะไม่สมเหตุสมผลอีกต่อไป
emory

3
@emory ฉันคิดว่าคุณกำลังมองหา backtick ไม่ใช่ $ตัวละครเพื่อทำให้สิ่งของคุณดูเป็นรหัส -y
Xymostech

33

ในฐานะที่เป็นวิธีการแก้ปัญหาในทางปฏิบัติ:

  1. ทำให้กองถุงเท้าที่แตกต่างได้อย่างรวดเร็ว (พูดตามสี)
  2. Quicksort ทุก ๆ กองและใช้ความยาวของถุงเท้าเพื่อเปรียบเทียบ ในฐานะมนุษย์คุณสามารถตัดสินใจได้อย่างรวดเร็วว่าถุงเท้าชนิดใดที่ใช้ในการแบ่งพาร์ติชันเพื่อหลีกเลี่ยงกรณีที่เลวร้ายที่สุด (คุณสามารถเห็นถุงเท้าหลายคู่ขนานใช้มันเพื่อประโยชน์ของคุณ!)
  3. หยุดการคัดแยกเสาเข็มเมื่อถึงเกณฑ์ที่คุณพอใจที่จะหาคู่สปอตและถุงเท้าที่ไม่สามารถเอาคืนได้ทันที

หากคุณมี 1,000 ถุงเท้ามี 8 สีและมีการแจกแจงโดยเฉลี่ยคุณสามารถทำ 4 กองของแต่ละถุงเท้า 125 ในเวลา c * n ด้วยขีด จำกัด 5 ถุงเท้าคุณสามารถจัดเรียงทุกกองใน 6 วิ่ง (การนับ 2 วินาทีเพื่อโยนถุงเท้าบนกองขวาจะทำให้คุณใช้เวลาน้อยกว่า 4 ชั่วโมง)

หากคุณมีถุงเท้าเพียง 60 ถุงเท้า 3 สีและถุงเท้า 2 แบบ (ของคุณ / ภรรยาของคุณ) คุณสามารถจัดเรียงถุงเท้า 10 กองในการวิ่ง 1 ครั้งทุกครั้ง (threshold อีกครั้ง = 5) (การนับ 2 วินาทีจะใช้เวลา 2 นาที)

การคัดแยกถังเริ่มต้นจะทำให้กระบวนการของคุณเร็วขึ้นเพราะมันจะแบ่ง n ถุงเท้าของคุณออกเป็น k buckets ในc*nเวลาดังนั้นคุณจะต้องc*n*log(k)ทำงานเท่านั้น (ไม่คำนึงถึงเกณฑ์) ดังนั้นทั้งหมดที่คุณทำเกี่ยวกับn*c*(1 + log(k))งานโดยที่ c คือเวลาที่จะโยนถุงเท้าลงบนกอง

วิธีการนี้จะดีเมื่อเทียบกับวิธีใด ๆ c*x*n + O(1)log(k) < x - 1วิธีการประมาณตราบเท่าที่


ในสาขาวิทยาการคอมพิวเตอร์สิ่งนี้มีประโยชน์: เรามีชุดของ n สิ่งต่าง ๆเรียงตามลำดับ (ความยาว) และความสัมพันธ์ที่เท่าเทียมกัน (ข้อมูลเพิ่มเติมตัวอย่างเช่นสีของถุงเท้า) ความสัมพันธ์ที่เท่าเทียมช่วยให้เราสามารถสร้างพาร์ติชันของคอลเลกชันดั้งเดิมและในทุกระดับความเท่าเทียมกันคำสั่งของเรายังคงอยู่ การทำแผนที่ของสิ่งกับคลาสที่เทียบเท่าสามารถทำได้ใน O (1) ดังนั้นจำเป็นต้องใช้ O (n) เพื่อกำหนดแต่ละรายการให้กับคลาส ตอนนี้เราได้ใช้ข้อมูลพิเศษของเราและสามารถดำเนินการต่อเพื่อเรียงลำดับทุกชั้นเรียน ข้อดีคือชุดข้อมูลมีขนาดเล็กลงอย่างมากแล้ว

วิธีการนี้ยังสามารถซ้อนกันได้ถ้าเรามีความสัมพันธ์ที่เท่าเทียมกันหลาย ๆ อัน -> ทำเสาเข็มสีมากกว่าภายในพาร์ติชันกองทั้งหมดบนพื้นผิวมากกว่าเรียงตามความยาว ความสัมพันธ์ที่เท่าเทียมกันใด ๆ ที่สร้างพาร์ติชันที่มีองค์ประกอบมากกว่า 2 รายการที่มีขนาดเท่ากันจะทำให้การปรับปรุงความเร็วสูงกว่าการเรียงลำดับ (หากเราสามารถกำหนดถุงเท้าให้กับกองได้โดยตรง) และการเรียงลำดับสามารถเกิดขึ้นได้อย่างรวดเร็วบนชุดข้อมูลขนาดเล็ก


3
การหาค่าเหมาะที่สุดของมนุษย์: ฉันขอยืนยันว่าในฐานะมนุษย์สำหรับขั้นตอนที่ 2 คุณควรทำให้ถุงเท้าลงในลำดับที่สูงขึ้นจากนั้นทำซ้ำด้วยความละเอียดปลีกย่อยและปลีกย่อยจนเรียงกันเล็กน้อย สิ่งนี้จะเร็วกว่าสำหรับมนุษย์ (การประมาณด้วยสายตา) มากกว่าวิธีการเปรียบเทียบแบบแลกเปลี่ยน
AndrewC

28

คุณกำลังพยายามแก้ไขปัญหาที่ผิด

โซลูชันที่ 1:ทุกครั้งที่คุณใส่ถุงเท้าสกปรกในตะกร้าซักผ้าของคุณ ด้วยวิธีนี้คุณจะไม่ต้องทำการเรียงลำดับใด ๆ หลังจากการซัก คิดเหมือนการลงทะเบียนดัชนีในฐานข้อมูล Mongo การทำงานล่วงหน้าเล็กน้อยเพื่อการประหยัด CPU ในอนาคต

โซลูชันที่ 2:ถ้าเป็นฤดูหนาวคุณไม่จำเป็นต้องสวมถุงเท้าที่ตรงกัน เราเป็นโปรแกรมเมอร์ ไม่มีใครจำเป็นต้องรู้ตราบใดที่มันใช้งานได้

โซลูชันที่ 3:กระจายงาน คุณต้องการดำเนินการกระบวนการ CPU ที่ซับซ้อนแบบอะซิงโครนัสโดยไม่ปิดกั้น UI หยิบถุงเท้านั้นมาใส่ในถุง มองหาคู่เมื่อคุณต้องการ วิธีนี้ปริมาณงานที่ใช้จะน้อยลงอย่างเห็นได้ชัด

หวังว่านี่จะช่วยได้!


5
การผูกถุงเท้า (หรือเสื้อผ้าใด ๆ ) ที่เป็นปมจะช่วยลดความสามารถของเครื่องซักผ้าในการซักเสื้อผ้าและทำให้การถอดเสื้อผ้ายากขึ้นมาก โซลูชันที่ 2 ทำให้การบำรุงรักษายากขึ้นเมื่อสถานะของกิจการดำเนินต่อไปอีกนาน หลังจาก 6 เดือนเมื่อคุณต้องการถุงเท้าข้อเท้าสีดำสองคู่สวมใส่กับกางเกงขาสั้นและรองเท้าผ้าใบ 6 เดือนของการทำงานอะไรก็ตามที่จะทำให้การค้นหาคู่นั้นอยู่ในสภาพเดียวกัน (สกปรก / สะอาดคล้ายกัน) มีโอกาสน้อยมาก โซลูชันที่ 3 น้อยกว่า "แบบอะซิงโครนัส" และ "ขี้เกียจ" แบบตรงมากขึ้น ทำงานขั้นต่ำที่คุณต้องการเมื่อคุณต้องการ
KeithS

Re: ทางออกที่ 2: ผู้คนจะรู้ว่าฉันไม่ได้สวมถุงเท้าที่ตรงกันเพราะพวกเขาจะเห็นพวกเขาใน Birks ของฉัน :)
Bob Probst

@BobProbst ใช่ แต่โปรแกรมเมอร์เพื่อนของคุณก็จะใส่ถุงเท้าที่ไม่มีคู่กับ Birks และดังนั้นจะมีความสุขที่สังเกตเห็นว่าพวกเขาไม่ใช่คนเดียว
Francesco Pasa

27

คำถามนี้เป็นปรัชญาเชิงลึกอย่างแท้จริง หัวใจสำคัญเกี่ยวกับว่าพลังของคนในการแก้ปัญหา ("wetware" ของสมองของเรา) เทียบเท่ากับสิ่งที่สามารถทำได้โดยอัลกอริทึม

อัลกอริทึมที่ชัดเจนสำหรับการเรียงถุงเท้าคือ:

Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N

ตอนนี้วิทยาศาสตร์คอมพิวเตอร์ในปัญหานี้เป็นเรื่องเกี่ยวกับขั้นตอน

  1. "ถ้า s จับคู่กับถุงเท้า t ใน N" เราสามารถ "จดจำ" สิ่งที่เราเห็นมาเร็วแค่ไหน
  2. "ลบ t จาก N" และ "เพิ่ม s ไปยัง N" ราคาแพงแค่ไหนที่ติดตามสิ่งที่เราเคยเห็นมา?

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

ในกรณีของถุงเท้าการเรียกคืนที่สมบูรณ์แบบหมายถึงการมองที่ถุงเท้าsจะสร้างความทรงจำของพี่น้องtเสมอรวมถึงข้อมูลที่เพียงพอ (ที่อยู่บนกระดานรีดผ้า) เพื่อค้นหาtในเวลาคงที่ คนที่มีหน่วยความจำการถ่ายภาพบรรลุทั้ง 1 และ 2 ในเวลาคงที่โดยไม่ล้มเหลว

บางคนที่มีหน่วยความจำน้อยกว่าที่สมบูรณ์อาจใช้คลาสความเท่าเทียมกันแบบไม่ จำกัด ตามคุณสมบัติในความสามารถของเขาในการติดตาม: ขนาด (พ่อ, แม่, ทารก), สี (เขียว, แดง, ฯลฯ ) รูปแบบ (argyle ธรรมดา ฯลฯ ) สไตล์ (ฟุตบอล, หัวเข่า, ฯลฯ ) ดังนั้นโต๊ะรีดผ้าจะถูกแบ่งออกเป็นส่วนสำหรับหมวดหมู่ สิ่งนี้มักจะอนุญาตให้หมวดหมู่อยู่ในหน่วยความจำคงที่เวลา แต่จากนั้นจะต้องค้นหาเชิงเส้นผ่านหมวดหมู่ "bucket"

คนที่ไม่มีความทรงจำหรือจินตนาการเลย (ขออภัย) จะเก็บถุงเท้าไว้ในกองเดียวและทำการค้นหาเชิงเส้นของกองทั้งหมด

คนที่ดูเรียบร้อยอาจใช้ป้ายกำกับตัวเลขสำหรับคู่ตามที่มีคนแนะนำ นี่เป็นการเปิดประตูสู่การสั่งซื้อทั้งหมดซึ่งทำให้มนุษย์สามารถใช้อัลกอริทึมแบบเดียวกันกับที่เราอาจใช้กับซีพียู: การค้นหาแบบไบนารี่, ต้นไม้, แฮช ฯลฯ

ดังนั้นอัลกอริธึม "ที่ดีที่สุด" ขึ้นอยู่กับคุณภาพของ wetware / hardware / software ที่ใช้งานและความตั้งใจของเราที่จะ "โกง" โดยจัดลำดับคำสั่งซื้อทั้งหมดเป็นคู่ แน่นอนว่า "ดีที่สุด" เมตาดาต้า -อัลกอริทึมคือการจ้าง sorter-sorter ที่ดีที่สุดในโลก: บุคคลหรือเครื่องจักรที่สามารถได้รับและจัดเก็บชุดของชุดถุงเท้าขนาดใหญ่ N ได้อย่างรวดเร็วในหน่วยความจำ 1-1 ที่เชื่อมโยงกับการค้นหาเวลาคงที่ และลบ ทั้งคนและเครื่องจักรเช่นนี้สามารถจัดหาได้ หากคุณมีหนึ่งคุณสามารถจับคู่ถุงเท้าทั้งหมดในเวลา O (N) สำหรับคู่ N ซึ่งเป็นสิ่งที่ดีที่สุด แท็กคำสั่งซื้อทั้งหมดช่วยให้คุณสามารถใช้การแฮชมาตรฐานเพื่อให้ได้ผลลัพธ์เดียวกันกับคอมพิวเตอร์มนุษย์หรือฮาร์ดแวร์


ตกลงดีกว่าแม้ว่ามันจะยังค่อนข้างผิด ... คำถามนี้ไม่เกี่ยวกับเรื่องนั้น ไม่ว่าวิทยานิพนธ์คริสตจักรทัวริงจะถูกต้องทั้งมนุษย์และคอมพิวเตอร์ของเราสามารถจัดเรียงถุงเท้า (ความจริงก็คือมนุษย์เป็นหน่วยงานที่ จำกัด อย่างมากมีพลังการคำนวณน้อยกว่าทัวริงแมชชีน ... และสิ่งเดียวกันกับคอมพิวเตอร์ของเรา แต่ข้อ จำกัด แตกต่างกัน)
Jim Balter

ฉันไม่เห็นด้วย. แน่นอนว่าคอมพิวเตอร์เครื่องใด ๆ ในปัจจุบันของเรานั้นมีความสำคัญและ DFA ขนาดใหญ่ (ความแตกต่างแบบโมดูโล i / o) มากกว่า TM อย่างไรก็ตามอุปกรณ์อะนาล็อกใด ๆ เช่นร่างกายของเราสามารถเลียนแบบเทปที่ไม่มีที่สิ้นสุด เรายังไม่มีลักษณะที่เป็นประโยชน์ในการคำนวณความคิดของเรา
ยีน

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

22

ราคา: ถุงเท้าเคลื่อนที่ -> สูงค้นหา / ค้นหาถุงเท้าในบรรทัด -> เล็ก

สิ่งที่เราต้องการทำคือลดจำนวนการเคลื่อนไหวและชดเชยด้วยจำนวนการค้นหา นอกจากนี้เรายังสามารถใช้สภาพแวดล้อมแบบมัลติเธรดของ Homo Sapiens เพื่อเก็บสิ่งต่าง ๆ ในแคช descision

X = ขอแสดงความนับถือ Y = คู่สมรสของคุณ

จากกอง A ของถุงเท้าทั้งหมด:

เลือกสองถุงเท้าวางถุงเท้า X ที่สอดคล้องกันในบรรทัด X และถุงเท้า Y ในบรรทัด Y ที่ตำแหน่งถัดไปที่พร้อมใช้งาน

ทำจนกว่า A จะว่างเปล่า

สำหรับแต่ละบรรทัด X และ Y

  1. เลือกถุงเท้าในบรรทัดแรกค้นหาตามบรรทัดจนกระทั่งพบถุงเท้าที่เกี่ยวข้อง

  2. ใส่ลงไปในถุงเท้าสำเร็จรูปที่เกี่ยวข้อง

  3. ทางเลือกขณะที่คุณกำลังค้นหาบรรทัดและถุงเท้าปัจจุบันที่คุณกำลังดูอยู่นั้นเหมือนกับก่อนหน้านี้ให้ทำตามขั้นตอนที่ 2 สำหรับถุงเท้าเหล่านี้

ทางเลือกสำหรับขั้นตอนที่หนึ่งคุณเลือกถุงเท้าสองอันจากบรรทัดนั้นแทนที่จะเป็นสองอันเนื่องจากหน่วยความจำแคชมีขนาดใหญ่พอที่เราจะสามารถระบุได้อย่างรวดเร็วว่าถุงเท้าใดตรงกับถุงเท้าปัจจุบันที่อยู่ในบรรทัดที่คุณกำลังสังเกตอยู่ หากคุณโชคดีพอที่จะมีสามแขนคุณอาจจะแยกถุงเท้าสามตัวในเวลาเดียวกันเนื่องจากหน่วยความจำของวัตถุมีขนาดใหญ่พอ

ทำจนกระทั่งทั้ง X และ Y ว่างเปล่า

เสร็จสิ้น

อย่างไรก็ตามเนื่องจากมีความซับซ้อนของการเรียงลำดับการเลือกเวลาที่น้อยกว่าเนื่องจากความเร็วของ I / O (ถุงเท้าเคลื่อนที่) และการค้นหา (ค้นหาบรรทัดสำหรับถุงเท้า)


22

นี่คือขอบเขตล่างของ Omega (n log n) ในรูปแบบการเปรียบเทียบ (การดำเนินการที่ถูกต้องเพียงอย่างเดียวคือการเปรียบเทียบสองถุงเท้า)

สมมติว่าคุณรู้ว่าถุงเท้า 2n ของคุณถูกจัดเรียงในลักษณะนี้:

p 1 p 2 p 3 ... p n p f (1) p f (2) ... p f (n)

โดยที่ f คือการเปลี่ยนแปลงที่ไม่รู้จักของเซต {1,2, ... , n} การรู้สิ่งนี้ไม่สามารถทำให้ปัญหาหนักขึ้นได้ มี n! เอาต์พุตที่เป็นไปได้ (การจับคู่ระหว่างครึ่งแรกและครึ่งหลัง) ซึ่งหมายความว่าคุณต้องการบันทึก (n!) = การเปรียบเทียบ Omega (n log n) สิ่งนี้สามารถทำได้โดยการจัดเรียง

เนื่องจากคุณมีความสนใจในการเชื่อมต่อกับปัญหาความแตกต่างขององค์ประกอบ: การพิสูจน์ Omega (n log n) ที่เชื่อมโยงกับความแตกต่างขององค์ประกอบนั้นยากกว่าเพราะเอาต์พุตเป็นไบนารี่ใช่ / ไม่ใช่ ที่นี่ผลลัพธ์จะต้องมีการจับคู่และจำนวนของผลลัพธ์ที่เป็นไปได้เพียงพอที่จะได้รับขอบเขตที่เหมาะสม อย่างไรก็ตามมีตัวแปรที่เชื่อมโยงกับความแตกต่างขององค์ประกอบ สมมติว่าคุณได้รับ 2n ถุงเท้าและสงสัยว่าพวกเขาสามารถจับคู่ที่ไม่ซ้ำกัน คุณจะได้รับการลดลงจาก ED โดยการส่ง (ก1เป็น2 ... เป็นn ) (ก1ที่1ที่2ที่2 ... เป็นnเป็นn ) การพิสูจน์ความแข็งของ ED นั้นน่าสนใจมากผ่านทอพอโลยี.)

ฉันคิดว่าควรจะมีโอเมก้า (n 2 ) สำหรับปัญหาดั้งเดิมหากคุณอนุญาตให้ทดสอบความเท่าเทียมกันเท่านั้น สัญชาตญาณของฉันคือ: พิจารณากราฟที่คุณเพิ่มขอบหลังการทดสอบและยืนยันว่าหากกราฟไม่หนาแน่นเอาท์พุทจะไม่ได้รับการพิจารณาที่ไม่ซ้ำกัน


19

นี่คือวิธีที่ฉันทำจริง ๆ สำหรับถุงเท้าคู่p ( n = 2pถุงเท้าแต่ละตัว):

  • หยิบถุงเท้าโดยการสุ่มจากกอง
  • สำหรับถุงเท้าแรกหรือถ้าถุงเท้าที่เลือกไว้ก่อนหน้านี้ทั้งหมดถูกจับคู่เพียงวางถุงเท้าลงใน "ช่อง" แรกของ "อาร์เรย์" ของถุงเท้าที่ไม่มีคู่ที่อยู่ตรงหน้าคุณ
  • หากคุณมีถุงเท้าที่ไม่มีคู่เลือกหนึ่งถุงเท้าหรือมากกว่าให้ตรวจสอบถุงเท้าปัจจุบันของคุณกับถุงเท้าที่ไม่มีคู่ในอาร์เรย์
    • เป็นไปได้ที่จะแยกถุงเท้าออกเป็นคลาสหรือประเภททั่วไป (สีขาว / ดำข้อเท้า / ลูกเรือกีฬา / ชุด) เมื่อสร้างชุดของคุณและ "เจาะลึก" เพื่อเปรียบเทียบแบบที่เหมือนกันเท่านั้น
    • หากคุณพบว่าการแข่งขันที่ยอมรับได้ให้ใส่ถุงเท้าทั้งคู่เข้าด้วยกันแล้วนำออกจากอาร์เรย์
    • หากคุณไม่ใส่ถุงเท้าปัจจุบันลงในช่องเปิดแรกในอาร์เรย์
  • ทำซ้ำกับถุงเท้าทุกอัน

สถานการณ์ที่เลวร้ายที่สุดของโครงร่างนี้คือถุงเท้าทุกคู่มีความแตกต่างกันมากพอที่จะต้องจับคู่ให้ตรงกันและถุงเท้าn / 2ชิ้นแรกที่คุณเลือกนั้นแตกต่างกัน นี่เป็นสถานการณ์O (n 2 ) ของคุณและไม่น่าเป็นไปได้มากนัก ถ้าจำนวนชนิดที่ไม่ซ้ำกันของถุงเท้าทีน้อยกว่าจำนวนของคู่p = n / 2และถุงเท้าในแต่ละประเภทมีความเหมือนกันมากพอ (โดยปกติในแง่การสึกหรอที่เกี่ยวข้อง) ที่ถุงเท้าประเภทนั้น ๆ สามารถจับคู่กับใด ๆ อื่น ๆ จากนั้นเมื่อฉันสรุปข้างต้นจำนวนสูงสุดของถุงเท้าที่คุณจะต้องเปรียบเทียบกับคือtหลังจากนั้นหนึ่งถุงเท้าถัดไปที่คุณจะดึงหนึ่งในการแข่งขันของถุงเท้า unpaired สถานการณ์นี้เป็นมากมีแนวโน้มในลิ้นชักถุงเท้าเฉลี่ยกว่ากรณีเลวร้ายที่สุดและลดความซับซ้อนกรณีเลวร้ายที่สุดที่จะO (n * t) ที่มักจะT << n


1
นี่อาจใกล้เคียงกับกระบวนการทางจิตของฉัน ฉันมีเลเยอร์เพิ่มของการเพิ่มประสิทธิภาพการจัดเรียงล่วงหน้า ถุงเท้ากีฬาของฉันได้รับการล้างด้วยผ้าขาวและถุงเท้าของฉันได้รับการล้างด้วยสี ซึ่งหมายความว่าตราบใดที่ฉันไม่ทิ้งซักรีดสองถังเข้าด้วยกันถุงเท้าของฉันก็จะถูกจัดกลุ่มตามประเภท ภาระสีขาววิ่งเร็วมาก (ถุงเท้าที่เหมือนกันจำนวนมาก) แต่ถุงเท้าแต่งตัวใช้เวลานานกว่า เคล็ดลับที่สำคัญอื่น ๆ - ให้มากขึ้นหน่วยความจำที่มีอยู่สำหรับการจัดเรียง (พับและถอดถุงเท้าไม่ใช่ทั้งหมดก่อนแล้วจึงเรียกใช้ขั้นตอนวิธีการจับคู่)
ORH

17

วิธีการในโลกแห่งความจริง:

โดยเร็วที่สุดเท่าที่จะทำได้ให้ถอดถุงเท้าออกจากกองที่ไม่เรียงลำดับในแต่ละครั้งและวางไว้ในกองหน้าคุณ ควรมีการจัดเรียงกอง - พื้นที่อย่างมีประสิทธิภาพโดยถุงเท้าทุกตัวชี้ไปในทิศทางเดียวกัน จำนวนกองถูก จำกัด ด้วยระยะทางที่คุณสามารถเข้าถึงได้ง่าย การเลือกกองที่จะใส่ถุงเท้าควร - อย่างรวดเร็วที่สุด - โดยการวางถุงเท้าบนกองที่ดูเหมือนถุงเท้า ประเภทที่ 1 เป็นครั้งคราว (วางถุงเท้าบนกองที่ไม่ได้อยู่ในนั้น) หรือพิมพ์ครั้งที่สอง (วางถุงเท้าไว้ในกองของตัวเองเมื่อมีกองถุงเท้าที่มีอยู่เหมือนกัน) ข้อผิดพลาดสามารถยอมรับได้ - สิ่งที่สำคัญที่สุดคือความเร็ว .

เมื่อถุงเท้าทั้งหมดอยู่ในกองให้ผ่านกองถุงเท้าหลายคู่อย่างรวดเร็วเพื่อสร้างคู่และนำออก (เหล่านี้เป็นหัวเรื่องสำหรับลิ้นชัก) หากมีถุงเท้าที่ไม่เข้าคู่กันในกองให้ตอกเสาเข็มอีกครั้งจนสุด (ภายในข้อ จำกัด เร็วที่สุดเท่าที่เป็นไปได้) เมื่อประมวลผลหลายกองถุงเท้าแล้วให้จับคู่ถุงเท้าที่เหลือซึ่งจับคู่ไม่ได้เนื่องจากข้อผิดพลาด Type II อ๊ะคุณเสร็จแล้ว - และฉันมีถุงเท้าเยอะ ๆ และอย่าซักจนกว่าพวกมันจะสกปรกมาก อีกข้อสังเกตที่เป็นประโยชน์: ฉันพลิกด้านบนของถุงเท้าหนึ่งคู่ลงมาอีกด้านหนึ่งโดยใช้ประโยชน์จากคุณสมบัติความยืดหยุ่นของพวกเขาดังนั้นพวกเขาจึงอยู่ด้วยกันในขณะที่ถูกขนส่งไปยังลิ้นชักและในขณะที่อยู่ในลิ้นชัก


15

จากคำถามของคุณเป็นที่ชัดเจนว่าคุณไม่มีประสบการณ์ซักผ้าจริงๆ :) คุณต้องการอัลกอริทึมที่ทำงานได้ดีกับถุงเท้าที่ไม่สามารถจับคู่ได้จำนวนน้อย

คำตอบจนถึงตอนนี้ไม่ได้ใช้ประโยชน์จากความสามารถในการจดจำรูปแบบของมนุษย์ เกมของ Set ให้ข้อมูลว่าทำอย่างไรดี: ใส่ถุงเท้าทั้งหมดในพื้นที่สองมิติเพื่อให้คุณสามารถจดจำได้ดีและเข้าถึงได้ง่ายด้วยมือของคุณ สิ่งนี้ จำกัด ให้คุณมีพื้นที่ประมาณ 120 * 80 ซม. หรือมากกว่านั้น จากนั้นเลือกคู่ที่คุณรู้จักและลบออก ใส่ถุงเท้าพิเศษในพื้นที่ว่างแล้วทำซ้ำ หากคุณล้างถุงเท้าสำหรับคนที่จำถุงเท้าได้ง่าย (เด็กเล็กนึกถึง) คุณสามารถทำการเรียงลำดับแบบ Radix ได้โดยเลือกถุงเท้าก่อน อัลกอริทึมนี้ทำงานได้ดีก็ต่อเมื่อจำนวนถุงเท้าเดียวต่ำ


นั่นเป็นวิธีที่ฉันทำ ทำงานได้ดีกว่าการวนซ้ำผ่านถุงเท้าที่เหลืออยู่ในแต่ละครั้ง
yu_ominae

วิธีการที่ดีและฉันคิดว่ามันสามารถนำไปใช้กับปัญหา CS จริงได้เช่นกัน คุณช่วยเพิ่มตัวอย่างของปัญหาดังกล่าวได้ไหม (ปัญหา CS ที่เราสามารถใช้แนวทางที่คล้ายกันเพื่อแก้ปัญหา) นอกจากนี้วิธีการนี้ปรับขนาดถุงเท้านับล้านได้อย่างไร
amit

ฉันคิดว่านี่เป็นพื้นเดียวกันกับคำตอบอื่น ๆ ที่นี่stackoverflow.com/a/14423956ตั้งแต่วันที่ 20 มกราคมทั้ง +1 ระบบการมองเห็นของมนุษย์นั้นขนานกันอย่างหนาแน่น
Will Ness

15

หยิบถุงเท้าก้อนแรกแล้ววางลงบนโต๊ะ ตอนนี้เลือกถุงเท้าอื่น หากตรงกับที่เลือกครั้งแรกให้วางไว้ด้านบนของอันแรก ถ้าไม่วางไว้บนโต๊ะห่างจากจุดแรกเล็กน้อย เลือกถุงเท้าที่สาม ถ้ามันตรงกับสองอย่างใดอย่างหนึ่งก่อนหน้านี้วางไว้ด้านบนของพวกเขาหรืออื่น ๆ วางไว้เป็นระยะทางเล็ก ๆ จากที่สาม ทำซ้ำจนกว่าคุณจะได้รับถุงเท้าทั้งหมด


1
นี่เป็นคำตอบเดียวที่ถูกต้อง คนอื่น ๆ ไม่สนใจความจริงที่ว่าเวลาส่วนใหญ่จะใช้เวลาแยกความแตกต่างระหว่างถุงเท้าที่คล้ายกัน
entonio

เพื่อความสนุกฉันเขียนวิธีการซ้อนถุงเท้าลงในโปรแกรม python ตัวน้อยgist.github.com/justinfay/53b574cf0a492f6795ef
Justin Fay

12

เพื่อที่จะบอกว่ามันมีประสิทธิภาพแค่ไหนในการจับคู่ถุงเท้าจากกองเราต้องกำหนดเครื่องก่อนเพราะการจับคู่นั้นไม่ได้ทำไม่ว่าจะเป็นการทัวริงหรือโดยเครื่องเข้าถึงแบบสุ่มซึ่งโดยปกติจะใช้เป็นพื้นฐานสำหรับ การวิเคราะห์อัลกอริทึม

เครื่องจักร

เครื่องเป็นนามธรรมขององค์ประกอบโลกแห่งความจริงที่เรียกว่ามนุษย์ มันสามารถอ่านจากสภาพแวดล้อมผ่านดวงตาคู่หนึ่ง และแบบจำลองเครื่องของเราสามารถจัดการสิ่งแวดล้อมโดยใช้ 2 แขน การดำเนินการทางตรรกะและคณิตศาสตร์คำนวณโดยใช้สมองของเรา (หวังว่า ;-))

เราต้องพิจารณา runtime ที่แท้จริงของการปฏิบัติการปรมาณูที่สามารถดำเนินการได้ด้วยเครื่องมือเหล่านี้ เนื่องจากข้อ จำกัด ทางกายภาพการดำเนินงานที่ดำเนินการโดยแขนหรือตามีความซับซ้อนเวลาไม่คงที่ นี่เป็นเพราะเราไม่สามารถขยับถุงเท้ากองใหญ่อย่างไม่มีที่สิ้นสุดด้วยตาทั้งคู่และไม่สามารถมองเห็นถุงเท้าชั้นบนสุดบนกองถุงเท้าที่ไม่มีที่สิ้นสุด

อย่างไรก็ตามฟิสิกส์เชิงกลก็ให้สารพัดกับเราเช่นกัน เราไม่ จำกัด การเคลื่อนไหวที่ถุงเท้าด้วยแขนเดียว เราสามารถย้ายทั้งคู่ได้ในคราวเดียว

ดังนั้นขึ้นอยู่กับการวิเคราะห์ก่อนหน้านี้การดำเนินการดังต่อไปนี้ควรใช้ในลำดับถัดลงมา:

  • การดำเนินการทางตรรกะและคณิตศาสตร์
  • อ่านสิ่งแวดล้อม
  • การแก้ไขสิ่งแวดล้อม

นอกจากนี้เรายังสามารถใช้ประโยชน์จากความจริงที่ว่าผู้คนมีถุงเท้าจำนวน จำกัด เท่านั้น ดังนั้นการปรับเปลี่ยนสภาพแวดล้อมสามารถเกี่ยวข้องกับถุงเท้าทั้งหมดในกอง

อัลกอริทึม

ดังนั้นนี่คือคำแนะนำของฉัน:

  1. กระจายถุงเท้าทั้งหมดในกองเหนือพื้น
  2. หาคู่ด้วยการดูถุงเท้าบนพื้น
  3. ทำซ้ำตั้งแต่ 2 จนกระทั่งไม่สามารถทำคู่ได้
  4. ทำซ้ำตั้งแต่วันที่ 1 จนกว่าจะไม่มีถุงเท้าอยู่บนพื้น

จำเป็นต้องปฏิบัติงาน 4 เพราะเมื่อถุงเท้ากระจายอยู่เหนือพื้นถุงเท้าบางคนอาจซ่อนคนอื่น นี่คือการวิเคราะห์อัลกอริทึม:

การวิเคราะห์

อัลกอริทึมจะสิ้นสุดลงด้วยความน่าจะเป็นสูง นี่เป็นเพราะความจริงที่ว่าเราไม่สามารถหาถุงเท้าคู่ในขั้นตอนที่ 2

สำหรับการวิเคราะห์รันไทม์ต่อไปนี้ของการจับnคู่ถุงเท้าเราคิดว่าอย่างน้อยครึ่งหนึ่งของ2nถุงเท้าไม่ได้ถูกซ่อนหลังจากขั้นตอนที่ 1 ดังนั้นโดยทั่วไปแล้วเราสามารถหาn/2คู่ได้ ซึ่งหมายความว่าการวนซ้ำเป็นขั้นตอนที่ 4 จะถูกดำเนินการO(log n)ครั้ง ขั้นตอนที่ 2 จะถูกดำเนินการO(n^2)ครั้ง ดังนั้นเราสามารถสรุปได้:

  • อัลกอริทึมเกี่ยวข้องกับO(ln n + n)การปรับเปลี่ยนสภาพแวดล้อม (ขั้นตอนที่ 1 O(ln n)บวกการหยิบถุงเท้าทุกคู่จากพื้น)
  • อัลกอริทึมเกี่ยวข้องกับการO(n^2)อ่านด้านสิ่งแวดล้อมจากขั้นตอนที่ 2
  • อัลกอริทึมเกี่ยวข้องกับO(n^2)การดำเนินการทางตรรกะและคณิตศาสตร์สำหรับการเปรียบเทียบถุงเท้ากับอื่นในขั้นตอนที่ 2

ดังนั้นเราจึงมีความซับซ้อนโดยรวมในการทำงานของO(r*n^2 + w*(ln n + n))ที่rและwเป็นปัจจัยสำหรับการดำเนินการอ่านด้านสิ่งแวดล้อมและการเขียนด้านสิ่งแวดล้อมตามลำดับสำหรับจำนวนถุงเท้าที่เหมาะสม ค่าใช้จ่ายของการดำเนินการเชิงตรรกะและเชิงคณิตศาสตร์ถูกละเว้นเพราะเราคิดว่ามันต้องใช้จำนวนคงที่ของการดำเนินการเชิงตรรกะและคณิตศาสตร์ในการตัดสินใจว่าถุงเท้า 2 คู่เป็นของคู่เดียวกันหรือไม่ สิ่งนี้อาจไม่สามารถทำได้ในทุกสถานการณ์


1
นี่เป็นเช่นเดียวกับstackoverflow.com/a/14423956และstackoverflow.com/a/14468913ฉันคิดว่า
Will Ness

@ WillNess Yep พร้อมคำอธิบายอีกเล็กน้อย
SpaceTrucker

12
List<Sock> UnSearchedSocks = getAllSocks();
List<Sock> UnMatchedSocks = new list<Sock>();
List<PairOfSocks> PairedSocks = new list<PairOfSocks>();

foreach (Sock newSock in UnsearchedSocks)
{
  Sock MatchedSock = null;
  foreach(Sock UnmatchedSock in UnmatchedSocks)
  {
    if (UnmatchedSock.isPairOf(newSock))
    {
      MatchedSock = UnmatchedSock;
      break;
    }
  }
  if (MatchedSock != null)
  {
    UnmatchedSocks.remove(MatchedSock);
    PairedSocks.Add(new PairOfSocks(MatchedSock, NewSock));
  }
  else
  {
    UnmatchedSocks.Add(NewSock);
  }
}

12

ฉันออกมาพร้อมกับวิธีแก้ไขปัญหาอื่นซึ่งจะไม่รับประกันการทำงานน้อยลงไม่สิ้นเปลืองเวลาน้อยลง แต่ควรพยายามดูว่ามันเป็นวิธีแก้ปัญหาที่ดีพอที่จะให้การใช้เวลาน้อยลงในการจับคู่ถุงเท้าขนาดใหญ่หรือไม่

เงื่อนไข: ไม่มีการรับประกันว่ามีถุงเท้าเดียวกัน หากพวกเขามีสีเดียวกันก็ไม่ได้หมายความว่าพวกเขามีขนาดหรือลวดลายเหมือนกัน ถุงเท้าถูกสับแบบสุ่ม อาจมีจำนวนถุงเท้าแปลก ๆ (บางอย่างหายไปเราไม่ทราบว่ามีจำนวนเท่าไร) เตรียมจำดัชนี "ตัวแปร" และตั้งค่าเป็น 0

ผลลัพธ์จะมีหนึ่งหรือสองกอง: 1. "จับคู่" และ 2 "หายไป"

Heuristic:

  1. ค้นหาถุงเท้าที่โดดเด่นที่สุด
  2. ค้นหาคู่ที่ตรงกัน
  3. หากไม่มีการแข่งขันให้วางไว้บนกอง "ที่หายไป"
  4. ทำซ้ำตั้งแต่ 1 จนกระทั่งไม่มีถุงเท้าที่โดดเด่นที่สุดอีกต่อไป
  5. หากมีน้อยกว่า 6 ถุงเท้าไปที่ 11
  6. จับคู่ถุงเท้าทุกคู่กับเพื่อนบ้าน (อย่าแพ็ค)
  7. ค้นหาคู่ที่ตรงกันทั้งหมดแพ็คมันและย้ายคู่ที่บรรจุแล้วไปที่ "จับคู่" กอง; หากไม่มีการแข่งขันใหม่ - เพิ่ม "ดัชนี" ทีละ 1
  8. หาก "ดัชนี" มากกว่า 2 แล้ว (นี่อาจเป็นค่าขึ้นอยู่กับจำนวนถุงเท้าเพราะจำนวนถุงเท้าที่มากขึ้นมีโอกาสน้อยกว่าที่จะจับคู่แบบสุ่ม) ไปที่ 11
  9. สับเปลี่ยนส่วนที่เหลือ
  10. ไปที่ 1
  11. ลืม "ดัชนี"
  12. เลือกถุงเท้า
  13. หาคู่
  14. หากไม่มีถุงเท้าให้ย้ายไปที่กอง "หายไป"
  15. หากพบคู่ที่ตรงกันให้จับคู่แพ็คแล้วย้ายไปที่กอง "ที่ตรงกัน"
  16. ถ้ายังมีมากกว่าหนึ่งถุงเท้าไปที่ 12
  17. หากมีเพียงหนึ่งที่เหลือไปที่ 14
  18. รอยยิ้มพอใจ :)

นอกจากนี้ยังอาจมีการตรวจสอบเพิ่มเติมสำหรับถุงเท้าที่เสียหายด้วยเช่นถ้าการลบเหล่านั้น สามารถแทรกระหว่าง 2 และ 3 และระหว่าง 13 และ 14

ฉันรอคอยที่จะได้ยินเกี่ยวกับประสบการณ์หรือการแก้ไขใด ๆ


หลังจากที่ฉันเขียนฉันใช้ทุกครั้ง มันช่วยให้ฉันมีประสิทธิภาพมากขึ้นและงานน่าเบื่อน้อยลงในขณะนี้
Sasa

11

เมื่อฉันจัดเรียงถุงเท้าฉันจะทำการเรียงลำดับแบบประมาณโดยประมาณวางถุงเท้าใกล้ถุงเท้าอื่นที่มีสี / ลวดลายเหมือนกัน ยกเว้นในกรณีที่ฉันสามารถดูการแข่งขันที่แน่นอนที่ / ใกล้สถานที่ฉันกำลังจะวางถุงเท้าที่ฉันแยกคู่ที่จุดนั้น

อัลกอริทึมอื่น ๆ เกือบทั้งหมด (รวมถึงคำตอบให้คะแนนสูงสุดโดย usr ) จะเรียงลำดับแล้วลบคู่ ฉันพบว่าในฐานะมนุษย์จะดีกว่าหากลดจำนวนถุงเท้าที่พิจารณาในครั้งเดียว

ฉันทำสิ่งนี้โดย:

  1. การเลือกถุงเท้าที่โดดเด่น (สิ่งใดก็ตามที่ดึงดูดสายตาของฉันก่อนในกอง)
  2. การเริ่มเรียงลำดับ radix จากตำแหน่งที่เป็นแนวคิดนั้นโดยการดึงถุงเท้าจากกองตามความคล้ายคลึงกับอันนั้น
  3. วางถุงเท้าใหม่ใกล้กับกองปัจจุบันโดยมีระยะทางตามความแตกต่างของมัน หากคุณพบว่าตัวเองวางถุงเท้าไว้ด้านบนของอีกอันเพราะมันเหมือนกันให้จับคู่ที่นั่นแล้วถอดออก ซึ่งหมายความว่าการเปรียบเทียบในอนาคตใช้ความพยายามน้อยลงในการค้นหาสถานที่ที่ถูกต้อง

สิ่งนี้ใช้ประโยชน์จากความสามารถของมนุษย์ในการจับคู่แบบคลุมเครือในเวลา O (1) ซึ่งค่อนข้างเทียบเท่ากับการสร้างแผนที่แฮชบนอุปกรณ์คอมพิวเตอร์

ด้วยการดึงถุงเท้าที่โดดเด่นเป็นอันดับแรกคุณจะเว้นช่องว่างไว้ที่ "ซูม" ในคุณสมบัติที่มีความโดดเด่นน้อยกว่าเพื่อเริ่มต้น

หลังจากกำจัดสี fluro แล้วถุงเท้าที่มีลายทางและถุงเท้ายาวสามคู่คุณอาจท้ายด้วยถุงเท้าสีขาวส่วนใหญ่เรียงตามวิธีการใส่

ในบางจุดความแตกต่างระหว่างถุงเท้านั้นเล็กพอที่คนอื่นจะไม่สังเกตเห็นความแตกต่างและไม่จำเป็นต้องใช้ความพยายามในการจับคู่ใด ๆ เพิ่มเติม


10

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

นอกจากนี้ยังหมายความว่าคุณแทบจะไม่เคยมีถุงเท้าทั้งหมดอยู่ในชุดเพราะถุงเท้าจะถูกลบออกเมื่อเข้าคู่กัน


นี่คือสิ่งที่ฉันทำ ... O (n)
Pykler

2
@Pykler - เป็น O (n) ในกรณีที่ดีที่สุดและ O (n * n) ในกรณีที่แย่ที่สุด
Vilx-

2
นั่นคือสมมติว่าคุณไม่สามารถสร้างแฮชที่เป็นเอกลักษณ์ในใจของถุงเท้าทั้งหมดที่คุณได้เห็นซึ่งสำหรับฉันคือ O (1) เพื่อจับคู่ถุงเท้าที่ฉันได้เห็นและก่อนหน้านี้และวางไว้ในรอการแฮชที่
Pykler

10

พิจารณาตารางแฮชของขนาด 'N'

หากเราสมมติว่ามีการแจกแจงแบบปกติจำนวนที่คาดว่าจะ 'แทรก' อย่างน้อยหนึ่งถุงเท้าที่แมปกับที่ฝากข้อมูลหนึ่งชุดคือ NlogN (กล่าวคือถังทั้งหมดเต็ม)

ฉันได้รับสิ่งนี้เป็นส่วนหนึ่งของปริศนาตัวอื่น แต่ฉันยินดีที่จะพิสูจน์ว่าผิด นี่คือบทความบล็อกของฉันเหมือนกัน

ให้ 'N' สอดคล้องกับขอบเขตบนโดยประมาณของจำนวนสี / รูปแบบของถุงเท้าที่คุณมี

เมื่อคุณมีการปะทะกัน (aka: match) เพียงแค่ถอดถุงเท้าคู่นั้นออก ทำซ้ำการทดลองเดียวกันกับถุงเท้า NlogN ชุดต่อไป ความงามของมันคือคุณสามารถทำการเปรียบเทียบแบบขนานของ NlogN (การแก้ปัญหาการชน) เนื่องจากวิธีที่จิตใจของมนุษย์ทำงาน :-)


10

ถุงเท้าไม่ว่าจะเป็นของจริงหรือโครงสร้างข้อมูลที่คล้ายคลึงกัน

คำตอบที่ง่ายที่สุดคือก่อนที่จะอนุญาตให้มีการแยกคู่โครงสร้างข้อมูลเดี่ยวสำหรับคู่ควรได้รับการเตรียมใช้งานที่มีตัวชี้ไปทางซ้ายและขวาถุงเท้าจึงเปิดใช้งานถุงเท้าที่จะเรียกโดยตรงหรือผ่านคู่ของพวกเขา ถุงเท้าอาจขยายเพื่อให้มีตัวชี้ไปยังคู่ของมัน

วิธีนี้จะแก้ปัญหาการจับคู่การคำนวณใด ๆ โดยการลบมันด้วยชั้นของนามธรรม

การใช้ความคิดเดียวกันกับปัญหาที่เกิดขึ้นจริงของการจับคู่ถุงเท้าคำตอบที่ชัดเจนคือ: ไม่อนุญาตให้ถุงเท้าของคุณไม่มีคู่ ถุงเท้ามีให้เป็นคู่วางไว้ในลิ้นชักเป็นคู่ (อาจจะรวมเข้าด้วยกัน) ใส่เป็นคู่ แต่จุดที่เป็นไปไม่ได้จับคู่อยู่ในเครื่องซักผ้าดังนั้นสิ่งที่ต้องการคือกลไกทางกายภาพที่ช่วยให้ถุงเท้าอยู่ด้วยกันและล้างได้อย่างมีประสิทธิภาพ

มีความเป็นไปได้ทางกายภาพสองประการ:

สำหรับวัตถุ 'คู่' ที่เก็บตัวชี้ไปที่ถุงเท้าแต่ละอันเราอาจมีถุงผ้าที่เราใช้เพื่อเก็บถุงเท้าไว้ด้วยกัน ดูเหมือนว่าค่าใช้จ่ายมาก

แต่สำหรับถุงเท้าแต่ละอันที่มีการอ้างอิงถึงตัวอื่น ๆ มันมีทางออกที่เรียบร้อย: popper (หรือ 'ปุ่มสแน็ป' หากคุณเป็นคนอเมริกัน) เช่น:

http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html

จากนั้นสิ่งที่คุณทำก็คือถุงเท้าของคุณเข้าด้วยกันทันทีหลังจากที่คุณถอดออกและใส่ไว้ในตะกร้าซักผ้าของคุณและคุณได้ลบปัญหาที่ต้องจับคู่ถุงเท้าของคุณด้วยแนวคิดทางกายภาพ 'คู่'


ไม่ตอบคำถามเนื่องจากการจัดการกับข้อมูลที่จับคู่ไว้แล้วนั้นเป็นเรื่องง่ายคำถามคือจะทำอย่างไรเมื่อข้อมูลไม่ถูกต้องและคุณต้องการจับคู่
amit

8

หากการดำเนินการ "ย้าย" มีราคาค่อนข้างแพงและการดำเนินการ "เปรียบเทียบ" มีราคาถูกและคุณต้องย้ายทั้งชุดไปไว้ในบัฟเฟอร์ที่การค้นหาเร็วกว่าในที่เก็บข้อมูลดั้งเดิม ... เพียงรวมการเรียงลำดับลงในข้อบังคับ ย้าย.

ฉันพบว่าการบูรณาการกระบวนการในการจัดเรียงในการแขวนให้แห้งทำให้เป็นเรื่องง่าย ฉันจำเป็นต้องหยิบถุงเท้าแต่ละอันแล้วแขวน (ย้าย) และฉันไม่มีค่าใช้จ่ายใด ๆ เลยที่จะแขวนมันในสถานที่เฉพาะบนสาย ตอนนี้ไม่ได้บังคับให้ค้นหาบัฟเฟอร์ทั้งหมด (สตริง) ฉันเลือกที่จะวางถุงเท้าด้วยสี / เงา มืดลงไปทางขวาสว่างขึ้นด้านหน้ามีสีสัน ฯลฯ ตอนนี้ก่อนที่ฉันจะแขวนถุงเท้าแต่ละอันฉันมองไปที่ "ขวา" ถ้ามันมีคู่ที่ตรงกันอยู่ - ขีด จำกัด นี้ "สแกน" ถึงถุงเท้าอื่น 2-3 ตัว - และถ้าเป็น ฉันแขวนอีกอันอยู่ข้างๆ จากนั้นฉันก็ม้วนมันออกเป็นคู่ในขณะที่นำออกจากสายเมื่อแห้ง

ตอนนี้สิ่งนี้อาจดูเหมือนไม่แตกต่างจาก "การสร้างเสาเข็มตามสี" ที่แนะนำโดยคำตอบยอดนิยม แต่ก่อนอื่นโดยไม่เลือกเสาเข็มแยก แต่เป็นช่วงฉันไม่มีปัญหาในการจำแนกว่าเสา "สีม่วง" ไปที่ "สีแดง" หรือ "สีน้ำเงิน" มันแค่ไประหว่าง แล้วโดยการรวมสองการดำเนินงาน (แขวนให้แห้งและจัดเรียง) ค่าใช้จ่ายในการเรียงลำดับในขณะที่แขวนเป็น 10% ของการเรียงลำดับแยกจะเป็น


วิธีนี้มีข้อดีอีกสองข้อ: การอบแห้งแบบบรรทัดจะสูญเสียถุงเท้า IME น้อยลงกว่าเครื่องอบผ้าแบบม้วนและกระบวนการจัดเรียงสามารถขยายไปยังส่วนที่เหลือของซักรีดได้ดังนั้น (เช่น) ผ้าเช็ดตัวทั้งหมดอยู่ใกล้กันเพื่อพับออก บรรทัดและ binned และนำตรงไปยังที่เก็บของ นอกจากนี้ยังใช้งานในการผ่านความพยายามต่ำสองครั้งโดยวางเสื้อผ้าขึ้นและถอดมันอีกครั้ง
cphlewis

8

ฉันจับคู่ถุงเท้าของฉันเสร็จแล้วและฉันพบว่าวิธีที่ดีที่สุดที่จะทำคือ:

  • เลือกหนึ่งในถุงเท้าแล้ววางทิ้ง (สร้าง 'ถัง' สำหรับคู่นั้น)
  • หากรายการถัดไปเป็นคู่ของรายการก่อนหน้าให้นำไปไว้ในที่ฝากข้อมูลที่มีอยู่แล้วมิฉะนั้นสร้างรายการใหม่

ในกรณีที่เลวร้ายที่สุดหมายความว่าคุณจะมีถังเก็บน้ำที่แตกต่างกัน n / 2 และคุณจะมีการกำหนด n-2 เกี่ยวกับถังเก็บน้ำที่บรรจุคู่ของถุงเท้าปัจจุบัน เห็นได้ชัดว่าอัลกอริทึมนี้ทำงานได้ดีถ้าคุณมีคู่ไม่กี่คู่ ฉันทำได้ด้วย 12 คู่

มันไม่ได้เป็นวิทยาศาสตร์ แต่ก็ใช้ได้ดี :)


นี่ยังคงเป็นอัลกอริทึม O (n ^ 2) เนื่องจากคุณต้องวนซ้ำแต่ละครั้งเมื่อคุณดึงถุงเท้าใหม่ออกมา แต่เมื่อพิจารณาจากความจริงที่ว่าแม้ถุงเท้าที่ซื้อในชุดเดียวกันก็มีความแตกต่างกันเล็กน้อยซึ่งทำให้พวกเขามีประสิทธิภาพเป็นคู่ (หรือแม้แต่ที่ไม่ซ้ำกัน) ได้อย่างมีประสิทธิภาพ
Semisonic

เห็นด้วย แต่อัลกอริทึมของฉันกำลังสมมติว่ามนุษย์กำลังทำการจับคู่ ดังนั้นจะมีแคชอยู่ในใจเมื่อคุณกำลังค้นหาที่ฝากข้อมูลที่ตรงกันดังนั้นคุณไม่จำเป็นต้องวนซ้ำที่เก็บถังอีกต่อไป ไม่แน่ใจว่าโครงสร้างข้อมูลชนิดใดที่สร้างขึ้นสำหรับกลไกการแคชนี้ในหัวของฉันระหว่างการจับคู่
เกจิ

8

โซลูชันของฉันไม่ตรงกับความต้องการของคุณทุกประการตามที่ต้องการอย่างเป็นทางการ O(n)ใช้พื้นที่ "พิเศษ"อย่างไรก็ตามการพิจารณาสภาพของฉันมันมีประสิทธิภาพมากในการใช้งานจริงของฉัน ดังนั้นฉันคิดว่ามันน่าสนใจ

ใช้ร่วมกับภารกิจอื่น

เงื่อนไขพิเศษในกรณีของฉันคือฉันไม่ได้ใช้เครื่องอบแห้งเพียงแค่แขวนผ้าของฉันบนเครื่องเป่าผ้าธรรมดา ผ้าแขวนต้องO(n)ดำเนินการ (โดยวิธีฉันมักจะพิจารณาถังบรรจุปัญหาที่นี่) และปัญหาโดยธรรมชาติของมันต้องใช้พื้นที่ "พิเศษ" เชิงเส้น เมื่อฉันนำถุงเท้าใหม่ออกมาจากที่เก็บข้อมูลฉันจะลองวางสายที่อยู่ถัดจากคู่ของมันหากคู่นั้นแขวนอยู่แล้ว ถ้าเป็นถุงเท้าจากคู่ใหม่ฉันเว้นที่ว่างไว้ข้างๆ

Oracle Machine is Better ;-)

เห็นได้ชัดว่ามันต้องมีงานพิเศษเพื่อตรวจสอบว่ามีถุงเท้าจับคู่แขวนอยู่แล้วและจะแก้ปัญหาO(n^2)ด้วยสัมประสิทธิ์เกี่ยวกับ1/2คอมพิวเตอร์ แต่ในกรณีนี้ "ปัจจัยมนุษย์" เป็นประโยชน์จริง ๆ - โดยปกติฉันจะเร็วมาก (เกือบO(1)) ระบุถุงเท้าที่ตรงกันถ้ามันถูกแขวนอยู่แล้ว (อาจจะมีการแคชในสมองที่มองไม่เห็น) - พิจารณาว่าเป็นชนิดของ "oracle" จำกัด เช่นเดียวกับในOracle Machine ;-) เรามนุษย์มีข้อได้เปรียบเหนือเครื่องดิจิตอลในบางกรณี ;-)

มีเกือบO(n)!

ดังนั้นการเชื่อมต่อปัญหาของการจับคู่ถุงเท้ากับปัญหาของผ้าที่แขวนอยู่ฉันได้รับO(n)"พื้นที่พิเศษ" ฟรีและมีวิธีแก้ปัญหาที่เกี่ยวกับO(n)เวลาต้องใช้งานมากกว่าเพียงผ้าแขวนที่เรียบง่ายและช่วยให้เข้าถึงคู่ที่สมบูรณ์ได้ทันที ถุงเท้าแม้ในเช้าวันจันทร์ที่เลวร้ายมาก ... ;-)


8

ฉันหวังว่าฉันสามารถมีส่วนร่วมกับสิ่งใหม่ในปัญหานี้ ฉันสังเกตเห็นว่าคำตอบทั้งหมดละเลยความจริงที่ว่ามีสองจุดที่คุณสามารถทำการประมวลผลล่วงหน้าได้โดยไม่ทำให้ประสิทธิภาพการซักโดยรวมของคุณช้าลง

นอกจากนี้เราไม่จำเป็นต้องสมมติถุงเท้าจำนวนมากแม้แต่สำหรับครอบครัวใหญ่ ถุงเท้าถูกนำออกมาจากลิ้นชักและสวมใส่แล้วพวกเขาจะถูกโยนในสถานที่ (อาจจะเป็นถังขยะ) ที่พวกเขาอยู่ก่อนที่จะถูกซัก ในขณะที่ฉันจะไม่เรียกว่า bin LIFO-Stack แต่ฉันว่ามันปลอดภัยที่จะสมมติ

  1. ผู้คนขว้างถุงเท้าทั้งคู่ลงในพื้นที่เดียวกันของถังขยะ
  2. ถังขยะไม่ได้ถูกสุ่ม ณ จุดใด ๆ ดังนั้น
  3. ชุดย่อยใด ๆ ที่นำมาจากด้านบนของถังขยะนี้โดยทั่วไปจะมีถุงเท้าทั้งคู่

เนื่องจากเครื่องซักผ้าที่ฉันรู้จักมีขนาด จำกัด (ไม่ว่าคุณจะต้องซักกี่ถุงเท้า) และการสุ่มเกิดขึ้นจริงในเครื่องซักผ้าไม่ว่าเราจะมีถุงเท้ากี่ตัวเราจึงมีชุดย่อย ๆ ซึ่งแทบจะไม่มีเลย 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 เครื่องซักผ้าธรรมดาแบบ จำกัด และราวตากผ้าธรรมดาแบบ จำกัด แต่ก็ยังใช้ได้กับถุงเท้าจำนวนมาก

เกี่ยวกับการขนาน: ตราบใดที่คุณโยนถุงเท้าทั้งสองลงในถังขยะเดียวกันคุณสามารถขนานขั้นตอนเหล่านั้นทั้งหมดได้อย่างง่ายดาย


ถุงเท้าเป็นเพียงคำเปรียบเทียบสำหรับการจับคู่วัตถุโดยพลการในฐานข้อมูลบางอย่าง
amit

1
เข้าใจแล้วไม่เห็นว่าคุณเป็นผู้แต่ง หากคุณต้องการโซลูชันทั่วไปคุณควรพูดอย่างนั้น อย่างไรก็ตามไม่มีอะไรผิดปกติในการรับข้อมูลใด ๆ ที่คุณมีอยู่ในบัญชีเว้นแต่คุณจะต้องคิดหาวิธีแก้ปัญหาโดยทั่วไป - การให้ความสามารถในการนำกลับมาใช้ใหม่ของโซลูชันอาจส่งผลให้มีประสิทธิภาพที่ดีขึ้นอย่างมาก ในกรณีนี้การพิจารณากรณีการใช้งานและฐานข้อมูลที่มีอยู่ทั้งหมดจะเป็นประโยชน์ อย่างไรก็ตามคำตอบพิเศษสำหรับคำถามพิเศษของคุณมีปัญหากับถุงเท้าที่มีลักษณะคล้ายกันเช่นถุงเท้าสีดำที่มีขนาดแตกต่างกันดังนั้นจึงไม่สามารถใช้ได้ในบางกรณี
Philipp Flenker

1
นอกจากนี้คุณไม่ได้รับ upvote> 2k เพราะคุณถามคำถามเกี่ยวกับการจับคู่ออบเจ็กต์โดยพลการในฐานข้อมูล คุณ จำกัด คำถามโดยเฉพาะเนื่องจากลักษณะของถุงเท้า (ซึ่งคุณไม่สามารถคัดลอกซึ่งตรงข้ามกับข้อมูล) คุณยังสนับสนุนให้ใช้ข้อเท็จจริงที่ว่าคุณสามารถแยกถุงเท้าออกจากถุงเท้าของคู่สมรสของคุณได้อย่างง่ายดาย หากคุณถามคำถามเกี่ยวกับถุงเท้าอย่าคาดหวังว่าคำตอบจะเป็นเรื่องเกี่ยวกับฐานข้อมูล ;-)
Philipp Flenker

1
มีข้อสันนิษฐานบางประการ: mashine ซักผ้าปกติ, ราวตากผ้าปกติและความจริงที่ว่าคุณโยนถุงเท้าทั้งสองในถังขยะในเวลาเดียวกันซึ่งหมายความว่าในกรณีส่วนใหญ่ถุงเท้าทั้งสองอยู่ในเครื่องเดียวกันและจำนวนของ ถุงเท้าที่เหลือจะเรียงลำดับจึงมีขนาดเล็ก แต่เนื่องจากคุณต้องการคำตอบเกี่ยวกับการจัดเก็บออบเจ็กต์โดยพลการในฐานข้อมูลมันมีประโยชน์จริงๆหรือไม่ที่จะพูดถึงวิธีแก้ไขปัญหาของฉัน
Philipp Flenker

1
อย่างที่ฉันพูดฉันคิดว่าฉันพูดถึงทุกสิ่งที่คุณขอยกเว้นปัญหาความชัดเจนของธาตุซึ่งคนอื่น ๆ ได้รับคำตอบแล้ว ฉันไม่ได้พยายามที่จะเป็น douche ที่นี่ แต่ฉันได้ใช้ความพยายามอย่างมากในการตอบกลับในขณะนี้และฉันรู้สึกผิดหวังเล็กน้อยที่ตอนนี้คุณผ่านบางคำตอบและอ้างว่าพวกเขาไม่ได้ตอบคำถามเดิม . ทำไมคุณไม่เพียงทิ้งกระทู้ทั้งหมดไว้ - มันยังเป็นเรื่องที่น่าสนใจหลังจากอ่านไป 2 ปีแล้ว?
Philipp Flenker

8

ฉันได้ทำตามขั้นตอนง่าย ๆ เพื่อลดความพยายามของฉันในกระบวนการที่ใช้เวลา O (1)

โดยการลดการป้อนข้อมูลของฉันให้เป็นหนึ่งในสองประเภทของถุงเท้า (ถุงเท้าสีขาวเพื่อการพักผ่อนหย่อนใจ, ถุงเท้าสีดำสำหรับการทำงาน) ฉันเพียงแค่ต้องกำหนดว่าฉันมีสองถุงเท้าในมือ (ในทางเทคนิคเนื่องจากพวกเขาไม่เคยล้างด้วยกันฉันได้ลดขั้นตอนเป็น O (0) เวลา)

ต้องใช้ความพยายามล่วงหน้าในการค้นหาถุงเท้าที่ต้องการและซื้อในปริมาณที่เพียงพอเพื่อกำจัดความต้องการถุงเท้าที่มีอยู่ของคุณ เมื่อฉันทำสิ่งนี้ก่อนที่ฉันจะต้องการถุงเท้าสีดำความพยายามของฉันก็น้อยมาก แต่ระยะทางอาจแตกต่างกันไป

ความพยายามดังกล่าวได้รับการเห็นหลายครั้งในรหัสที่นิยมมากและมีประสิทธิภาพ ตัวอย่างรวมถึง # DEFINE'ing pi ไปยังหลาย ๆ ทศนิยม (มีตัวอย่างอื่นอยู่ แต่นั่นคือสิ่งที่อยู่ในใจตอนนี้)


7

สร้างตารางแฮชซึ่งจะใช้สำหรับถุงเท้าที่ไม่ตรงกันโดยใช้รูปแบบเป็นแฮช วนซ้ำในแต่ละถุงเท้า หากถุงเท้ามีรูปแบบที่ตรงกันในตารางแฮชให้นำถุงเท้าออกจากโต๊ะแล้วสร้างเป็นคู่ หากถุงเท้าไม่มีคู่ที่ตรงกันให้ใส่ลงในตาราง


ทำอย่างไรจึงจะไม่เข้าแทนที่ตามที่ระบุไว้โดยเฉพาะในคำถาม
amit

7

ปัญหาของการเรียงลำดับคู่ของคุณ n ของถุงเท้าเป็น O (n) ก่อนที่คุณจะโยนทิ้งลงในตะกร้าซักผ้าด้ายซ้ายไปทางขวา เมื่อนำมันออกมาคุณตัดเกลียวและใส่แต่ละคู่เข้าไปในลิ้นชักของคุณ - มีการดำเนินงาน 2 คู่บน n คู่ดังนั้น O (n)

ตอนนี้คำถามต่อไปก็คือว่าคุณทำซักรีดของตัวเองและภรรยาของคุณของเธอ นั่นคือปัญหาที่มีแนวโน้มในโดเมนที่แตกต่างกันอย่างสิ้นเชิงของปัญหา :)


นี่ไม่ได้ตอบคำถามที่ถุงเท้าเป็นเพียงคำอุปมา
amit

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