ระยะทางที่สั้นที่สุดระหว่างจุดใน A และจุดใน B


9

ให้สองเซตและแต่ละอันมีจุดเชื่อมต่อจุดบนเครื่องบินคำนวณระยะทางที่สั้นที่สุดระหว่างจุดหนึ่งในและจุดหนึ่งในคือ\}ABnABmin { dist(p,q) | pAqB }

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


4
คำถามที่นี่คืออะไร
กราฟิลส์


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

3
"ชัดแจ้งซึ่งสามารถแก้ไขได้โดย LP ใน O (n) ในพื้นที่สองมิติ" - ฉันสงสัยว่าอะไรทำให้ข้อความนี้ "การเขียนโปรแกรมเชิงเส้น" โดยทั่วไปไม่สามารถแก้ไขได้ในเวลาเชิงเส้น "เชิงเส้น" หมายถึงอย่างอื่น ดังนั้น LP จึงมีรูปแบบพิเศษหรือไม่
กราฟิลส์

คำตอบ:


5

ฉันมีวิธีแก้ปัญหาซึ่งอาจดูเหมือนสับสนเล็กน้อย แต่ควรมีประสิทธิภาพมากกว่าการค้นหาแบบไร้เดียงสา :O(n2)

  1. ให้เป็นแกนระหว่างศูนย์ของมวลของและBvAB
  2. เรียงจุดในและตามแนวแกนนี้เรียงและเรียงลำดับตามลำดับส่งผลให้ในลำดับ , , ... ,และ , , ... , b_nABa0a1anb0b1bn

ส่วนที่เหลืออยู่ในรหัสหลอกเพื่อให้ชัดเจน:

d = infinity.
for j from 1 to n
    if (b_1 - a_j) along v > d then break endif
    for k from 1 to n
        if (b_k - a_j) along v > d then
            break
        else
            d = min( d , ||b_k - a_j|| )
        endif
    enddo
enddo

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

ในกรณีที่แย่กว่านี้ยังคงเป็นแต่ถ้าแยกและได้ดีมันควรจะเร็วกว่านั้นมาก แต่ไม่ควรดีกว่าซึ่งจำเป็นต้องใช้ สำหรับการเรียงลำดับO(n2)ABO(nlogn)

ปรับปรุง

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

สำหรับข้อเสนอแนะที่จะใช้อัลกอริทึม line-sweep ที่แก้ไขแม้ว่าจะง่าย ๆ โดยสังหรณ์ใจฉันไม่เชื่อว่านี่เป็นในเมื่อพิจารณาถึงชุดที่แยกจากกัน เช่นเดียวกันสำหรับอัลกอริทึมแบบสุ่มของ RabinO(nlogn)

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

อัลกอริทึมด้านบนสามารถมองเห็นได้ว่าเป็นตัวแปรของการกวาดเครื่องบินที่แนะนำในบทความแรก (Shan, Zhang และ Salzberg) แต่แทนที่จะใช้ -axis และไม่มีการเรียงลำดับแกนระหว่างชุดจะถูกใช้และชุดจะถูกสำรวจ ตามลำดับจากมากไปน้อย / จากน้อยไปมากx


2
@Pedro: ขออภัยฉันไม่ได้แสดงความคิดเห็นก่อนหน้านี้ (ไม่มีเวลาในเวลา) เหตุผลที่ฉัน downvote คำตอบของคุณเป็นเพราะมันเป็นคำตอบที่ไม่ดีและไม่ควรจะอยู่ด้านบน นี่เป็นปัญหาที่ทราบกันดีในเรขาคณิตการคำนวณที่มีตัวพิมพ์ใหญ่ที่สุด O (n log n) คำตอบที่ดีจะชี้ให้เห็นปัญหาที่ทราบ (อาจมีการอ้างอิง) และการแก้ปัญหาทั่วไปซึ่งรวมถึง: การใช้ต้นไม้ kd และการทดสอบองค์ประกอบตามลำดับ, ขั้นตอนวิธีการกวาด ฯลฯ แนวคิดทั่วไปควรจะ preprocess ในโครงสร้างที่สั่งซื้อและใช้ . ดูกรณี 1D - ชัดเจนมากขึ้น O (n log n) ที่นั่น
ex0du5

2
@ ex0du5: ดูเหมือนว่าคุณควรโพสต์คำตอบของคุณเอง! โปรดทราบว่า "มีคำตอบที่ดีกว่า" มักจะไม่ใช่เหตุผลที่ดีสำหรับการ downvoting มาตรการนี้ควรสงวนไว้สำหรับคำตอบที่ผิดสแปมและการจัดรูปแบบที่ไม่ดีมาก ของโดรส์ไม่ใช่ ดูเพิ่มเติมที่นี่เพื่อดูว่าคนบางคนคิดว่าควรได้รับการพิจารณาก่อนลงคะแนน
กราฟิลส์

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

1
@ ex0du5: ดูเหมือนว่าคุณมีเวลาพอสมควรแล้ว คุณสามารถแสดงให้เห็นว่าจริง ๆ แล้วอินสแตนซ์นี้เป็น "ปัญหาที่รู้จักกันดีกับกรณีที่เลวร้ายที่สุด " หรือไม่ O(nlogn)
Pedro

1
@ ex0du5: จริงๆแล้วการค้นหาเพื่อนบ้านที่ใกล้ที่สุดเช่นใช้ต้นไม้ KDมีเพียงเฉลี่ยซับซ้อน O (logn) เรากลับไปที่จตุรัสหนึ่ง
Pedro

4

คุณสามารถปรับ "คู่ที่อยู่ใกล้" อัลกอริทึม linesweepซึ่งเป็นn)O(nlogn)

การเปลี่ยนแปลงเพียงอย่างเดียวที่คุณต้องทำคือเพิกเฉยคู่ที่เป็นของชุดเดียวกัน

แก้ไข:จริง ๆ แล้วมันไม่ง่าย (หรือเป็นไปได้) ตามที่ฉันอธิบาย ดูความคิดเห็นสำหรับการอภิปราย


2
เพียงคำพูดหนึ่งยังสามารถปรับอัลกอริทึมหารและพิชิตคลาสสิกสำหรับคู่ที่ใกล้เคียงที่สุดซึ่งยังทำงานใน ; ดูวิกิพีเดีย O(nlogn)
rizwanhudda

1
สำหรับอัลกอริธึมเชิงเส้นเวลาแบบสุ่มดูตัวอย่างRabin พลิกเหรียญในบล็อกของ Lipton
Juho

3
คุณอาจจะเจาะจงมากขึ้นเกี่ยวกับวิธีที่คุณจะใช้สิ่งนี้สำหรับเซตที่แยกจากกันโดยเฉพาะในเรื่องการรักษาไว้? O(nlogn)
Pedro

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

1
@ เปโดร: ทำไมมันถึงใหญ่กว่านี้? หากมีสิ่งใดชุดคะแนนผู้สมัครปัจจุบันควรหดตัวลง
กราฟิลส์

4

แนวคิดในปัญหาเช่นนี้คือการสร้างโครงสร้างที่จัดเรียงจากหนึ่งในชุดที่อนุญาตการสืบค้นที่มีประสิทธิภาพของ กระดาษคลาสสิกที่นำเสนอโครงสร้างแบบสอบถาม O (log n) สำหรับมิติโดยพลการคือ:

Shamos และ Hoey สำหรับโซลูชั่น Voronoi

มีการสร้างพาร์ติชันพื้นที่อื่นจำนวนมากตามแนวคิดจาก Delauney tesselations ตั้งแต่นั้นมาและสิ่งเหล่านี้แปลเป็นคำอธิบายการกวาดพื้นที่หลากหลายที่หลากหลาย โปรดทราบว่าวิธี Voronoi ก็จะตกอยู่ภายใต้คำอธิบายแบ่งและพิชิตทั่วไปเนื่องจากมันเป็นการแบ่งเครื่องบินที่ทำให้ขั้นตอนการก่อสร้าง O (n log n)

ดังนั้นทางออกพื้นฐานสำหรับปัญหานี้คือ:

  1. ใช้ชุด A และสร้างโครงสร้างคิวรีเพื่อนบ้านที่ใกล้ที่สุดที่มีประสิทธิภาพที่คุณเลือก ขั้นตอนการก่อสร้างนี้คือ O (n log n) [ดูทฤษฎีบทที่ 4]
  2. สำหรับแต่ละองค์ประกอบใน B โครงสร้างแบบสอบถาม A สำหรับเพื่อนบ้านที่ใกล้ที่สุด แต่ละแบบสอบถามคือ O (log n) [ดูทฤษฎีบท 15, มิติคงที่] ดังนั้นเวลาแบบสอบถามทั้งหมดสำหรับจุดทั้งหมดใน B คือ O (n log n)
  3. เมื่อดึงผลลัพธ์สำหรับจุดที่ใกล้ที่สุดใน A ไปยังแต่ละ B ให้วางไว้ในโครงสร้างที่เรียงตามระยะทาง นี่คือ O (บันทึก n) แทรกผลลัพธ์แต่ละรายการหรือ O (n บันทึก n) สำหรับทุกรายการ
  4. เมื่อดู B ทั้งหมดแล้วคุณสามารถ (O (1)) รับจุด B ในโครงสร้างที่ได้รับคำสั่งโดยมีระยะเพื่อนบ้านน้อยที่สุดไปยังจุดใน A

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


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

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

คุณไม่ต้องการคำสั่งพิเศษในขณะที่วนซ้ำในขณะที่คำสั่งนั้นจำเป็นสำหรับ (มาก / ทั้งหมด?) อัลกอริทึม sweepline (ดังนั้นชื่อฉันเดา) B
กราฟิลส์

1

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

ขอบเขตล่างของปัญหานี้คือภายใต้โมเดลแผนผังการตัดสินใจเชิงพีชคณิต ฉันจะให้ร่างคร่าว ๆ ของหลักฐานที่นี่O(nlogn)

เราจะลดอินสแตนซ์ของปัญหาความแตกต่างขององค์ประกอบ E เป็น C

  • ป้อนไปที่ E: S={a1,a2,a3,...,an}
  • ให้ > 0 เป็นเศษส่วนเล็ก ๆϵ
  • A = ,{(ai,0):1in}B={(ai+ϵ):1in}
  • ตอนนี้ถ้าเราสามารถหาระยะทางที่สั้นที่สุด (d) ระหว่างเซต A และ B เราสามารถตัดสินปัญหาความแตกต่างขององค์ประกอบในเวลาดังนี้ O(n)
    • ชุดมีซ้ำถ้าหาก d =Sϵ

เรารู้ว่าผูกพันที่ลดลงในรันไทม์สำหรับการตัดสินใจปัญหาความแตกต่างองค์ประกอบคือ{n}) ดังนั้นโดยการลดขอบเขตล่างจึงใช้กับปัญหาของเราO(nlogn)

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