|
| basic_trie () |
| 空のコンテナを構築する [詳解]
|
|
| basic_trie (allocator_type const &alloc) |
| アロケータを指定して空のコンテナを構築する [詳解]
|
|
template<typename InputIterator , typename std::enable_if_t< std::is_integral_v< typename std::iterator_traits< InputIterator >::value_type >, std::nullptr_t > = nullptr> |
| basic_trie (InputIterator first, InputIterator last, allocator_type const &alloc=allocator_type()) |
| 直列化データから構築する [詳解]
|
|
template<typename ForwardIterator , typename std::enable_if_t< std::negation_v< std::is_integral< typename std::iterator_traits< ForwardIterator >::value_type >>, std::nullptr_t > = nullptr> |
| basic_trie (ForwardIterator first, ForwardIterator last, allocator_type const &alloc=allocator_type()) |
| 文字列のリストから構築する [詳解]
|
|
| basic_trie (std::initializer_list< detail::trie_node > il, allocator_type const &alloc=allocator_type()) |
| 初期化子リストから構築する [詳解]
|
|
template<typename InputIterator , typename std::enable_if_t< std::is_integral_v< typename std::iterator_traits< InputIterator >::value_type >, std::nullptr_t > = nullptr> |
void | assign (InputIterator first, InputIterator last) |
| 直列化データから割り当てる [詳解]
|
|
template<typename ForwardIterator , typename std::enable_if_t< std::negation_v< std::is_integral< typename std::iterator_traits< ForwardIterator >::value_type >>, std::nullptr_t > = nullptr> |
void | assign (ForwardIterator first, ForwardIterator last) |
| 文字列リストから割り当てる [詳解]
|
|
reference | at (const_iterator pos, index_type &idx) |
| 葉の値への参照を返す [詳解]
|
|
reference | at (const_iterator pos) |
| 葉の値への参照を返す [詳解]
|
|
const_reference | at (const_iterator pos) const |
| 葉の値への参照を返す [詳解]
|
|
template<typename InputIterator > |
reference | at (InputIterator first, InputIterator last) |
| 葉の値への参照を返す [詳解]
|
|
template<typename InputIterator > |
const_reference | at (InputIterator first, InputIterator last) const |
| 葉の値への参照を返す [詳解]
|
|
template<typename Key > |
reference | at (Key const &key) |
| 葉の値への参照を返す [詳解]
|
|
template<typename Key > |
const const_reference | at (Key const &key) const |
| 葉の値への参照を返す [詳解]
|
|
template<typename Key > |
reference | operator[] (Key const &key) |
| 葉の値への参照を返す [詳解]
|
|
const_iterator | begin () const noexcept |
| 根を指すイテレータを返す [詳解]
|
|
const_iterator | cbegin () const noexcept |
| 根を指すイテレータを返す [詳解]
|
|
const_iterator | end () const noexcept |
| 根の終端を指すイテレータを返す [詳解]
|
|
const_iterator | cend () const noexcept |
| 根の終端を指すイテレータを返す [詳解]
|
|
bool | empty () const noexcept |
| キー文字列を格納していないことを調べる [詳解]
|
|
size_type | size () const noexcept |
| 格納しているキー文字列数を調べる [詳解]
|
|
template<typename InputIterator > |
const_iterator | insert (InputIterator first, InputIterator last, value_type value=0) |
| キー文字列を挿入する [詳解]
|
|
template<typename Key > |
const_iterator | insert (Key const &key, value_type value=0) |
| キー文字列を挿入する [詳解]
|
|
void | erase (const_iterator pos) |
| キー文字列を削除する [詳解]
|
|
template<typename InputIterator > |
void | erase (InputIterator first, InputIterator last) |
| キー文字列を削除する [詳解]
|
|
template<typename Key > |
void | erase (Key const &key) |
| キー文字列を削除する [詳解]
|
|
void | swap (basic_trie< Label, Base > &other) |
|
template<typename InputIterator > |
auto | lookup (InputIterator first, InputIterator last) const |
| 部分一致検索 [詳解]
|
|
template<typename InputIterator > |
const_iterator | search (InputIterator first, InputIterator last) const |
| 前方一致検索 [詳解]
|
|
template<typename Key > |
const_iterator | search (Key const &key) const |
| 前方一致検索 [詳解]
|
|
template<typename InputIterator > |
const_iterator | find (InputIterator first, InputIterator last) const |
| 完全一致検索 [詳解]
|
|
template<typename Key > |
const_iterator | find (Key const &key) const |
| 完全一致検索 [詳解]
|
|
template<typename InputIterator > |
bool | contains (InputIterator first, InputIterator last) const |
| キー文字列が格納されているか調べる [詳解]
|
|
template<typename Key > |
bool | contains (Key const &key) const |
| キー文字列が格納されているか調べる [詳解]
|
|
template<typename Label, typename Base>
class wordring::basic_trie< Label, Base >
任意の整数型をラベルとして用いることが出来る汎用Trie
- テンプレート引数
-
Label | ラベルとして使用する任意の整数型 |
Base | 基本クラスとして使用するTrie実装クラス |
メモリー使用量削減を目標とする trie と葉からの空遷移先INDEXが衝突によって変更されない stable_trie が事前に定義されている。
template <typename Label, typename Allocator = std::allocator<detail::trie_node>>
using trie = basic_trie<Label, detail::trie_base<Allocator>>;
template <typename Label, typename Allocator = std::allocator<detail::trie_node>>
using stable_trie = basic_trie<Label, detail::stable_trie_base<Allocator>>;
- Trie木のコンセプト
Trie木の一般的な説明は、以下のページが詳しい。
https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4%E6%9C%A8
このクラスは、木に一般化するため、遷移ラベルをノードの値と見做せるよう設計した。 そのため、木に対するアルゴリズムを適用できる。
このクラスは任意の整数列を格納できるが、文書内では、キーとして使う整数列のことを文字列と表記する。
利用者からは、以下の図のように見える。
- ラベル
一般的にダブル・アレイはラベルとして8ビット整数を使うが、このクラスは直列化によって 任意の整数型をラベルとして利用することが出来る。 根はラベルを持たない。
- 値の格納
葉に2,147,483,647までの正の整数値を格納できる。 mapのように任意の型の値を格納できるよう拡張する場合、値の配列に対する添字を葉に格納することを想定している。 葉に格納される値の取得・設定にはメンバ関数 at() を使う。 イテレータの逆参照によって得られる値は遷移ラベルであり、葉に格納される値と明確に区別される。
- イテレータ
ノード間の移動には、イテレータを用いる。 イテレータは木に対するイテレータと互換性を保つよう設計した。 イテレータを逆参照すると親から当該ノードへの遷移に使われたラベルを取り出せる。
親を得るには parent() を使う。 子を得るには、begin() 、 end() 、 operator[]() を使う。 次の兄弟を得るには、 operator++() を使う。 葉を指しているか調べるには、operator bool() あるいは operator!() を使う。
- 予測入力への適用
部分木全体の走査にイテレータ・アダプタを使用できる。 search() と wordring::basic_tree_iterator を組み合わせることで、予測入力などに使える。
search() で前方一致検索を行い、戻り値のイテレータを親として wordring::basic_tree_iterator によって全走査を行う。 operator bool() で葉を確認し、葉を発見するたびに parent() で親をたどると、後続の文字列を容易に列挙できる。 候補数を制限したい場合、数に達した時点で走査を止めると良い。
- 直列化
Trie木は辞書や文字列アトムに使われるため、直列化が必要な場合がある。 直列化には ibegin(), iend() を使う。
ibegin() の逆参照は32ビット整数値を返す。 ファイルへ保存するためにバイト列を必要とする場合、直列化イテレータを使う。
- 速度
- テンプレート・パラメータ Label の大きさが1バイト
- 文字列リストがソートされている
- 文字列リストに重複が無い
以上の条件を満たした時、 assign() は最速となる。
挿入される文字列リストが事前にソートされている場合、挿入速度、検索速度共に高速化される。 ソートにかかる時間と挿入にかかる時間を足しても、ソートせずに挿入する時間に満たない。 したがって、文字列リストを事前にソートしておくことが望ましい。 検索速度に顕著な影響を与えることを考慮して事前のソートを推奨する。 挿入順による影響は std::set と同様の特性を示す。
ごく少量の文字列しか格納していない場合を除き、大部分が辞書順に挿入された条件下で、検索速度はどのSTLコンテナよりも速い。 一方、挿入速度はどのSTLコンテナよりも遅い。