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


9

นี่คือปัญหาเพื่อนบ้านที่ใกล้ที่สุด

รับ reals (ใหญ่มากn !), รวมทั้งเป้าหมายจริงp , หาa_iและa_jซึ่ง SUM ใกล้เคียงกับpมากที่สุด เราอนุญาตการประมวลผลล่วงหน้า / การจัดทำดัชนีที่เหมาะสมของa_1, \ ldots, a_n (ไม่เกินO (n \ log n) ) แต่ในเวลาแบบสอบถาม (ที่กำหนดp ) ผลลัพธ์ควรถูกส่งคืนอย่างรวดเร็ว (เช่นO (\ log n)เวลา)a1,,annpaiajpa1,,anO(nlogn)pO(logn)

(ตัวอย่างง่ายกว่า: ถ้าเราต้องการเพียงa_iเดียวaiที่ใกล้เคียงกับpมากที่สุดเราจะจัดเรียงa1,,anออฟไลน์, O(nlogn)จากนั้นทำการค้นหาแบบไบนารีที่เวลาสอบถามO(logn) )

โซลูชันที่ไม่ทำงาน:

1) จัดเรียงa1,,anออฟไลน์จากนั้นในเวลาสอบถามเริ่มต้นจากปลายทั้งสองและย้ายตัวชี้สองตัวเข้าด้านใน ( http://bit.ly/1eKHHDy ) ไม่ดีเนื่องจากเวลาสอบถามO(n)

2) เรียงออฟไลน์จากนั้นในเวลาแบบสอบถามใช้เวลาในแต่ละและดำเนินการค้นหาแบบไบนารีสำหรับ "เพื่อน" ที่จะช่วยให้มันรวมกับสิ่งที่ใกล้เคียงกับพีไม่ดีเนื่องจากเวลาสอบถามa1,,anaipO(nlogn)

3) จัดเรียงคู่ทั้งหมดออฟไลน์จากนั้นทำการค้นหาแบบไบนารี ไม่ดีเพราะการประมวลผลล่วงหน้า(a1,,an)O(n2)

ขอบคุณ!

PS การวางหลักเกณฑ์ทั่วไปเพิ่มเติมที่จำเป็นสำหรับการปฏิบัติ: (1)และเป็นเวกเตอร์ 50 มิติ, (2) "ปิด" เพื่อเป็นระยะทางโคไซน์โคไซน์และ (3) -bestest ไม่ใช่แค่ 1-besta1,,anpk


มีการ จำกัด เวลาในการประมวลผลล่วงหน้าหรือจำนวนพื้นที่ที่เราสามารถใช้หลังการประมวลผลล่วงหน้าหรือไม่ หากเรา จำกัด พื้นที่ไว้ที่คุณมีเหตุผลใดบ้างที่เชื่อว่าสามารถแก้ไขได้บอกเวลา ? นั่นดูเหมือนจะไม่น่าสำหรับฉัน O(n)O(lgn)
DW

การประมวลผลล่วงหน้าถูก จำกัด ไว้ที่ O ( log ) ฉันอัพเดตคำแถลงปัญหา nn
เควิน

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

คำตอบ:


17

นี่เป็นไปไม่ได้อย่างแน่นอน

สมมติว่าคุณสามารถแก้ปัญหาของคุณด้วยเวลาการประมวลผลล่วงหน้า P(n) และเวลาสอบถาม Q(n). จากนั้นมีอัลกอริทึมง่าย ๆ ในการแก้ปัญหา 3SUM - รับชุดn จำนวนจริงมีองค์ประกอบสามอย่างรวมกันเป็นศูนย์หรือไม่ - ใน P(n)+nQ(n)เวลา. เราประมวลผลหมายเลขทั้งหมดล่วงหน้าสำหรับแต่ละหมายเลขakเราหาค่าของ ai+aj ที่ใกล้เคียงที่สุด ak; ถ้ามันตรงกันak แน่นอนเราได้พบทางออกสำหรับปัญหา 3SUM แล้ว

อย่างไรก็ตามอัลกอริทึมที่เร็วที่สุดที่รู้จักสำหรับ 3SUM ทำงานอยู่ O(n2)เวลาและอัลกอริทึมนี้คาดเดาอย่างกว้างขวางว่าเหมาะสมที่สุด นอกจากนี้ยังมีการจับคู่Ω(n2)ขอบเขตล่างในโมเดลการคำนวณแบบต้นไม้ตัดสินใจที่ จำกัด แต่เป็นธรรมชาติ สำหรับชุดของจำนวนเต็มมีอัลกอริธึมเวลา subquadratic เล็กน้อยที่ "เล่นเกมด้วยบิต" แต่แม้ในรูปแบบ RAM จำนวนเต็ม 3SUM จะต้องคาดเดาว่าต้องการΩ(n2/polylogn) เวลา.

ดังนั้นสมมติว่าการคาดเดานั้นถูกต้องปัญหาของคุณอาจต้องใช้เวลา (ใกล้ -) กำลังประมวลผลกำลังสองกำลังสองหรือ (ใกล้ -) เวลาแบบสอบถามเชิงเส้น


2

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

  • ในระหว่างการประมวลผลล่วงหน้าให้คำนวณชุด {ai+aj:1ijn}และเก็บชุดนี้เรียงตามลำดับ ชุดนี้สามารถสร้างและเรียงลำดับO(n2) เวลาและมันต้องใช้ O(n2) พื้นที่ในการจัดเก็บ

  • ตอนนี้เพื่อตอบแบบสอบถาม (เพื่อค้นหา ai,aj ที่ไหน ai+aj ใกล้เคียงกับ pเป็นไปได้) เพียงทำการค้นหาแบบไบนารีในรายการเรียงลำดับนี้ ที่จะพาO(lgn) เวลา.

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


สวัสดีและขอบคุณ! แต่โซลูชันของคุณเหมือนกับโซลูชัน # 3 ของฉันซึ่งเป็นปัญหาเนื่องจากเวลาในการประมวลผลล่วงหน้า O (n ^ 2) ในกรณีของฉัน n มีขนาดใหญ่มาก (เช่น 1m) และฉันต้องหลีกเลี่ยงการทำงานของ O (n ^ 2)
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.