簡體   English   中英

有多少條線段將在一個平面內與水平線相交? 找到這個的最有效方法是什么

[英]how many line segments will intersect in a plane will intersect with a horizontal line ? what will be the most effective way to find this

我正在嘗試解決這個 Cyber​​chef 挑戰

給定平面上的 N 個點(編號為 1 到 N); 對於每個有效的 i,第 i 個點是 Pi=(i,Ai)。 它們之間有 N-1 條線段(編號為 1 到 N-1); 對於每個有效的 i,連接點 Pi 和 Pi+1 形成第 i 條線段。

你得到 Q 條水平線段。 每個查詢水平線段由兩個點表示,從一個點 (x1,y) 到一個點 (x2,y)(它停止並且不再進一步傳播)。 對於每個水平線段,您必須從它在途中碰撞的那些(N-1 條線段)中找出線段的數量。

所以這是問題所在:

  • 2<=N<= 100000
  • 1<=Q<= 100000

誰能教我什么方法在時間復雜度方面最好和最有效?

因此,您擁有唯一的折線,並且想要檢查與水平線段相交的許多查詢。

值得在該折線上構建某種二進制空間分區(BSP) 在這種情況下,您可以在O(log(n))時間內檢查交集,因此總時間為O(nlogn)+O(qlogn) (構建和檢查)


如果你的折線幸運的是多邊形(沒有一個閉合邊),事情就很簡單了——只需按 Y 坐標對邊進行排序並只檢查那些相交的查詢 Y(二元搜索,每個查詢的 log(n))。 在一般情況下(非凸面),您的折線可能看起來像WMWMWMW ,您必須檢查太多邊。

我用 kd 樹來解決這個問題。 也不要問正在進行的挑戰的問題。

所以掃描線算法是你基本上需要知道的,以解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM