[英]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
我正在嘗試解決這個 Cyberchef 挑戰:
給定平面上的 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 條線段)中找出線段的數量。
所以這是問題所在:
誰能教我什么方法在時間復雜度方面最好和最有效?
因此,您擁有唯一的折線,並且想要檢查與水平線段相交的許多查詢。
值得在該折線上構建某種二進制空間分區(BSP) 。 在這種情況下,您可以在O(log(n))
時間內檢查交集,因此總時間為O(nlogn)+O(qlogn)
(構建和檢查)
如果你的折線幸運的是凸多邊形(沒有一個閉合邊),事情就很簡單了——只需按 Y 坐標對邊進行排序並只檢查那些相交的查詢 Y(二元搜索,每個查詢的 log(n))。 在一般情況下(非凸面),您的折線可能看起來像WMWMWMW
,您必須檢查太多邊。
我用 kd 樹來解決這個問題。 也不要問正在進行的挑戰的問題。
所以掃描線算法是你基本上需要知道的,以解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.