簡體   English   中英

為什么/何時我們使用段樹進行范圍最小查詢?

[英]Why/When do we use segment trees for range minimum query?

我讀到,為了使用段樹實現范圍最小查詢,預處理需要 O(n) 時間,為每個查詢找到解決方案需要 O(log(n)) 時間。 它也需要額外的空間。

相反,如果我們簡單地為數組的某個子數組找到最小值,我們可以在 O(n) 中找到它。

那么,我們為什么要使用段樹實現呢? 物流有哪些?
是關於常數因子嗎?
當段樹特別有用時,是否存在特殊情況?

有許多結構可以讓您在亞線性時間內對 arrays 進行大量操作。 我將它們分為兩類:固定的和動態的。

固定結構擁有出色的查詢運行時間,但不支持數組更新。RMQ 允許您在恆定時間查詢(使用O(n log n)預計算和內存)中執行范圍 min/max/gcd,但不支持更新。 前綴總和可讓您在恆定時間內獲得范圍總和,但也不支持更新。 這兩個都是固定結構的示例,因為數組中的更新需要對結構進行近乎完整的重新計算。

為了支持更廣泛的操作,動態結構會犧牲更多的 memory 和時間。 BIT/Fenwick 樹讓您可以進行點更新,每次操作的范圍總和為O(log n) 這種結構的開銷比段樹低,並且在您只需要這些操作的情況下很有用。 然后當然是: Segment Trees

段樹確實支持范圍 min/max/gcd 查詢,例如 RMQ。 它們還支持范圍求和,例如 BIT / 前綴求和。 這些查詢支持更新,因此您可以像上面那樣進行點更新。 然而,只要有一點點聰明,他們就可以做得更多。 段樹很容易修改以支持范圍更新(為范圍內的每個元素添加/減去一個值)。 它們可以支持點集和范圍集查詢(將范圍內的所有值設置為所需的值),它們可以支持范圍按位運算(AND,OR. XOR),它們可以支持范圍計數(計算數量預定的所需數量)。 或返回查詢值的第一個/最后一個索引。

這些只是可以對段樹進行簡單修改以支持的一些操作。 可能性非常廣泛,這就是為什么段樹對於如此多的應用程序如此有用的結構。 了解他們非常重要,練習如何讓他們的力量解決你的問題是一項非常有用的技能。

暫無
暫無

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

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