差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:data_structure:sparse_table [2019/12/04] ikatakosprogramming_algorithm:data_structure:sparse_table [2019/12/05] – [実装] ikatakos
行 5: 行 5:
 ===== 概要 ===== ===== 概要 =====
  
-  * 区間最小値/最大値など、区間に対するクエリに答えられる +  * 区間最小値/最大値など、**区間に対するクエリ**に答えられる 
-  * 演算 $\oplus$ は、以下の条件を満たす必要がある(min, maxなどに相当する部分+  * 演算 $\oplus$ は、以下の条件を満たす必要がある(min, maxに相当するもの
     * 結合則: $(A \oplus B) \oplus C = A \oplus (B \oplus C)$     * 結合則: $(A \oplus B) \oplus C = A \oplus (B \oplus C)$
-    * 冪等性: $A \oplus = A \oplus B \oplus B \oplus ... \oplus B$+    * 冪等性: $A \oplus = A$
   * クエリ処理はとても速い $O(1)$   * クエリ処理はとても速い $O(1)$
   * 事前計算の計算量・メモリは少し多めに必要になる $O(N \log{N})$   * 事前計算の計算量・メモリは少し多めに必要になる $O(N \log{N})$
行 14: 行 14:
  
 足し算は冪等性を満たさないため、使えない。 足し算は冪等性を満たさないため、使えない。
-(別に使ってもいいのだが、区間を被らせずにクエリ処理するのは計算量 $O(\log{N})$ かかるし、+(別に使ってもいいのだが、クエリ処理計算量 $O(\log{N})$ かかるようになるし、
 それならセグメント木と同じ上にこちらは更新も出来るので、あまり優位性がない) それならセグメント木と同じ上にこちらは更新も出来るので、あまり優位性がない)
 +
 +min, maxの他には、最小公倍数/最大公約数なども冪等性を満たす。
  
 ===== データ構造 ===== ===== データ構造 =====
行 48: 行 50:
  
 PythonならNumPyを使えば、tableの構築において $k-1$ の計算結果を利用して $k$ を求める部分を高速化できる。 PythonならNumPyを使えば、tableの構築において $k-1$ の計算結果を利用して $k$ を求める部分を高速化できる。
 +(ただしminimum, maximum, lcm, gcdなど2つの配列の要素同士の演算を行う関数がNumPyに用意されているものに限る)
  
 <sxh python> <sxh python>
行 69: 行 72:
  
     def query(self, l, r):     def query(self, l, r):
 +        """ min value of [l, r) """
         d = r - l         d = r - l
         if d == 1:         if d == 1:
programming_algorithm/data_structure/sparse_table.txt · 最終更新: 2023/10/13 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0