Sparse Table とは Sparse Table とは、静的なデータに対して、範囲最小クエリ(RMQ)に答えることができるデータ構造です。 RMQ に答えることができるデータ構造に Segment Tree がありますが、データの変更に対応できるかどうかという点で異なります。Sparse Table はデータの変更はできない代わりに、前計算を行った上でRMQに O(1) で答えることが可能 […]
C# で Deque(両端キュー)を実装してみる 両端キュー – Wikipedia C# で Deque(両端キュー) を実装してみます。両端キューは以下の4つの操作が高速に行えるデータ構造のことです。 先頭に要素を挿入 先頭の要素を削除 末尾に要素を挿入 末尾の要素を削除 C# には標準ライブラリで LinkedList<T>(連結リスト) が用意されており、このデータ […]
Union-Find木 とは 素集合データ構造は、データの集合を素集合(互いにオーバーラップしない集合)に分割して保持するデータ構造。このデータ構造に対する以下の2つの便利な操作をUnion-Findアルゴリズムと呼ぶ。 Find: 特定の要素がどの集合に属しているかを求める。2つの要素が同じ集合に属しているかの判定にも使われる。 Union: 2つの集合を1つに統合する。 これら2つの操作をサポ […]
連結リストを自前で実装する 連結リストとは 連結リスト – Wikipedia 連結リスト (Linked List) とは基本的なデータ構造の1つです。配列のようなインデックスで順序が決まるのではなく、各オブジェクトが持つポインタによって順序を決めるデータ構造です。 連結リストにはいくつかの種類があります。一方向と双方向、循環と非循環などです。今回実装していくのは 双方向連結リスト […]
Stack, Queue を自前で実装する C# の場合、データ構造の Stack と Queue は標準ライブラリで提供されますが、自前で実装して理解を深めようと思います。 順番に見ていきます。 Stack (スタック) スタック – Wikipedia Stack は先入れ後出し(FILO)を実現するためのデータ構造です。 Stack は、データを入れる Push と積まれたデータ […]