高階資料結構之線段樹與掃瞄線演算法

2022-07-14 22:39:20 字數 1148 閱讀 8763

1. 掃瞄線演算法

1)原理:

平面掃瞄線演算法通常由掃瞄線、事件點、當前掃瞄事件點集合構成:通過掃瞄線按照某一方向依次掃瞄,掃瞄事件點,檢查事件點狀態,然後新增或刪除事件點以更新事件點集合。

2)看一道經典的問題:

lintcode391. 數飛機

給出飛機的起飛和降落時間的列表,用 interval 序列表示. 請計算出天上同時最多有多少架飛機?

這道題看起來很簡單,但是我的做法超時了:

public

class

solution

int timepoint = new

int[maxtime + 1];

for (int i = 1; i <= maxtime; i++)

}timepoint[i] =showtime;

}int res =integer.min_value;

for (int i = 1; i <= maxtime; i++)

return

res;

}}

這個解法是很細粒度的掃瞄,就是每個時刻都要掃瞄一次,所以當最長事件很大時,我開的資料就很大,就需要掃瞄很長的陣列。

那麼可否粗粒度的掃瞄呢?答那是可以的,就是只需要檢查起點和終點。因為一段時間的構成就是起點和終點,那麼涉及到事件點集合的變化就是起點的出現和終點的出現。

那麼具體是如何變化的呢?想一想,如果乙個起點出現,會發生什麼,就說明當前時刻又有乙個時間段出現了,如果終點出現,就說明當前時刻結束了乙個時間段。

那麼我們可以維護乙個count,來記錄實時事件點的變化。 當起點出現,count++;終點出現count--;哈,前提是這些時間段應該順序排列。

ok,按這個思路改了**,ac

public

class

solution

}public

int countofairplanes(listairplanes)

collections.sort(points,

new comparator()

});int res = 0, count = 0;

for(point point : points)

return

res;

}}

線段樹掃瞄線(2 算矩形的相交面積)

hdu 1255 首先感謝一下 titanium 從他的部落格中得到了思路 怎麼計算出重複的面積。我們先規定sum2 為 至少出現1次時統計的長度 sum為至少出現2次時的長度 如果某個區間的cnt 2 那麼 就表示這個這個區間的所有長度都是有效長度,sum就等於這個區間的總長度 當cnt 1時,表...

高階資料結構 線段樹

今天是很沉重的一天,進來ccf官宣取消oi,也不知道是不是真的。oier們不要放棄夢想!大家一定要勇往直前!這線段樹會很難 至少我是這麼想的 不過我也是經過百般實驗才敢寫這個部落格!假定我給你乙個定區間,讓你以最快的速度做這樣的操作 修改其中的乙個子區間,查詢另乙個子區間的值,而且重複這些操作。你會...

C 線段樹 高階資料結構

線段樹是一種平衡二叉搜尋樹 完全二叉樹 它將乙個線段區間劃分成一些單元區間。對於線段樹中的每乙個非葉子節點 a,b 他的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 最後的葉子節點數目為n,與陣列下標對應。線段樹的一般包括建立 查詢 插入 更新等操作,建立規模為n的時間...