เป็นไปได้ที่จะแก้ปัญหานี้ได้อย่างมีประสิทธิภาพโดยการคำนวณ gcd ของ pairwise ทั้งหมด, ลบรายการที่ซ้ำกัน, จากนั้นเรียกซ้ำ เป็นการลบสิ่งที่ซ้ำกันออกก่อนที่คุณจะทำการคืนค่าให้มีประสิทธิภาพ
ฉันจะอธิบายขั้นตอนวิธีการในรายละเอียดด้านล่าง แต่แรกก็จะช่วยให้การกำหนดผู้ประกอบการไบนารี\ถ้าเป็นชุดของจำนวนเต็มบวก, define⊗S,T
S⊗T={gcd(s,t):s∈S,t∈T}.
โปรดทราบว่าและ (ในปัญหาของคุณ); โดยทั่วไปจะมีขนาดเล็กกว่าขอบเขตที่แนะนำซึ่งช่วยให้อัลกอริทึมมีประสิทธิภาพ โปรดทราบว่าเราสามารถคำนวณได้|S⊗T|≤|S|×|T||S⊗T|≤109S⊗TS⊗Tกับการดำเนินงาน gcd โดยการแจงนับง่าย|S|×|T|
ด้วยสัญกรณ์นั้นนี่คืออัลกอริทึม ให้เป็นชุดตัวเลข คำนวณแล้วจากนั้นและอื่น ๆ ค้นหาเล็กที่สุดที่แต่S1S2=S1⊗S1S3=S1⊗S2S4=S1⊗S3k1∈Sk1∉Sk−1{k-1} แล้วคุณจะรู้ว่าขนาดของชุดย่อยดังกล่าวมีขนาดเล็กที่สุดคือkหากคุณต้องการส่งออกตัวอย่างที่เป็นรูปธรรมของชุดย่อยดังกล่าวโดยการรักษาพอยน์เตอร์พอยน์เตอร์คุณสามารถสร้างชุดดังกล่าวขึ้นใหม่ได้อย่างง่ายดายk
สิ่งนี้จะมีประสิทธิภาพค่อนข้างมากเนื่องจากไม่มีชุดค่ากลางใดที่ขยายขนาดขึ้น 109 (อันที่จริงขนาดอาจจะเล็กกว่านั้น) และเวลาทำงานต้องใช้ประมาณการดำเนินการ gcd500×(|S1|+|S2|+⋯)
นี่คือการเพิ่มประสิทธิภาพที่อาจปรับปรุงประสิทธิภาพยิ่งขึ้นไปอีก โดยทั่วไปคุณสามารถใช้ซ้ำสองเท่าเพื่อหาสิ่งที่เล็กที่สุดดังกล่าวที่S_k โดยเฉพาะอย่างยิ่งสำหรับแต่ละองค์ประกอบเราติดตามการย่อยที่เล็กที่สุดของมี GCD คือและขนาดซึ่งเป็นฉัน (เมื่อคุณลบรายการที่ซ้ำกันคุณแก้ไขความสัมพันธ์ในความโปรดปรานของเซตย่อยที่มีขนาดเล็กกว่า) ตอนนี้แทนที่จะคำนวณลำดับที่เก้าเซตแทนการคำนวณลำดับห้าชุดโดยการคำนวณจากนั้นk1∈Skx∈SiS1x≤iS1,S2,S3,S4,…,S9S1,S2,S4,S8,S9S2=S1⊗S1จากนั้นจากนั้นS4=S2⊗S2S8=S4⊗S4S9=S1×S8S_8 ขณะที่คุณไปพบครั้งแรกดังกล่าวที่S_k เมื่อคุณได้พบดังกล่าวที่คุณสามารถหยุดได้ทันที: คุณสามารถหาชุดย่อยที่เล็กที่สุดที่มี GCD เป็นโดยดูที่เซตที่เกี่ยวข้องกับการ1ดังนั้นคุณสามารถหยุดทันทีที่คุณมาถึงชุดที่ซึ่งจะช่วยให้คุณสามารถหยุดก่อนถ้าคุณพบชุดย่อยที่เล็กกว่าk∈[1,2,4,8,9]1∈Skk1∈Sk11Sk1∈Sk
สิ่งนี้ควรมีประสิทธิภาพด้านเวลาและประหยัดพื้นที่ เพื่อประหยัดพื้นที่สำหรับแต่ละองค์ประกอบคุณไม่จำเป็นต้องเก็บทั้งชุด: มันเพียงพอที่จะเก็บ backpointers สองตัว (ดังนั้นองค์ประกอบทั้งสองของที่คุณใช้ gcd ของเพื่อรับ ) และ เลือกขนาดของชุดย่อยที่สอดคล้องกันx∈SkSi,Sjx
ในหลักการที่คุณสามารถเปลี่ยนลำดับโดยอื่น ๆห่วงโซ่นอกจากนี้ ฉันไม่รู้ว่าห่วงโซ่การเติมอื่น ๆ จะดีกว่านี้หรือไม่ ตัวเลือกที่ดีที่สุดอาจขึ้นอยู่กับการกระจายของคำตอบที่ถูกต้องและขนาดที่คาดหวังของชุด[1,2,4,8,9]Skซึ่งไม่ชัดเจนสำหรับฉัน แต่อาจได้รับสังเกตุจากการทดลอง
เครดิต: ขอบคุณ KWillets สำหรับแนวคิดในการจัดเก็บชุดย่อยของตัวเลขพร้อมกับแต่ละองค์ประกอบของซึ่งช่วยให้หยุดก่อนได้Si